aboutsummaryrefslogtreecommitdiff
path: root/test/lint/lint-python-mutable-default-parameters.py
diff options
context:
space:
mode:
authorTakeshiMusgrave <tkm45@cornell.edu>2022-04-07 12:14:12 -0400
committerTakeshiMusgrave <tkm45@cornell.edu>2022-04-08 11:53:47 -0400
commite8e48fa82bdce3f0c1da0693148867befa221de7 (patch)
tree1f566407bb35172858ec30c85b851bcd804c8933 /test/lint/lint-python-mutable-default-parameters.py
parent38d3d0bfc4cae6b31c5ac30f9b0da458bd9a9e57 (diff)
downloadbitcoin-e8e48fa82bdce3f0c1da0693148867befa221de7.tar.xz
Converted lint-python-mutable-default-parameters.sh to python
Change permission Change argument so that it's compatiable with python 3.6 Change comment to docstring Remove .split, .append, .extend calls. Remove 'output' variable assignment
Diffstat (limited to 'test/lint/lint-python-mutable-default-parameters.py')
-rwxr-xr-xtest/lint/lint-python-mutable-default-parameters.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/test/lint/lint-python-mutable-default-parameters.py b/test/lint/lint-python-mutable-default-parameters.py
new file mode 100755
index 0000000000..7991e3630b
--- /dev/null
+++ b/test/lint/lint-python-mutable-default-parameters.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+"""
+Detect when a mutable list or dict is used as a default parameter value in a Python function.
+"""
+
+import subprocess
+import sys
+
+
+def main():
+ command = [
+ "git",
+ "grep",
+ "-E",
+ r"^\s*def [a-zA-Z0-9_]+\(.*=\s*(\[|\{)",
+ "--",
+ "*.py",
+ ]
+ output = subprocess.run(command, stdout=subprocess.PIPE, universal_newlines=True)
+ if len(output.stdout) > 0:
+ error_msg = (
+ "A mutable list or dict seems to be used as default parameter value:\n\n"
+ f"{output.stdout}\n"
+ f"{example()}"
+ )
+ print(error_msg)
+ sys.exit(1)
+ else:
+ sys.exit(0)
+
+
+def example():
+ return """This is how mutable list and dict default parameter values behave:
+
+>>> def f(i, j=[], k={}):
+... j.append(i)
+... k[i] = True
+... return j, k
+...
+>>> f(1)
+([1], {1: True})
+>>> f(1)
+([1, 1], {1: True})
+>>> f(2)
+([1, 1, 2], {1: True, 2: True})
+
+The intended behaviour was likely:
+
+>>> def f(i, j=None, k=None):
+... if j is None:
+... j = []
+... if k is None:
+... k = {}
+... j.append(i)
+... k[i] = True
+... return j, k
+...
+>>> f(1)
+([1], {1: True})
+>>> f(1)
+([1], {1: True})
+>>> f(2)
+([2], {2: True})"""
+
+
+if __name__ == "__main__":
+ main()