aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2017-05-01 15:11:01 -0700
committerJussi Pakkanen <jpakkane@gmail.com>2017-05-02 21:57:26 +0300
commita8173630eac1f35914fdc2d918a636ac268b9033 (patch)
treec971b7e0be066df5a2a77f1141eb1517dd3903ef /mesonbuild/interpreterbase.py
parentae924b01a006bc1542fe7eaae1d8a933459e8a0a (diff)
downloadmeson-a8173630eac1f35914fdc2d918a636ac268b9033.zip
meson-a8173630eac1f35914fdc2d918a636ac268b9033.tar.gz
meson-a8173630eac1f35914fdc2d918a636ac268b9033.tar.bz2
Don't use len() to test emptiness vs not emptiness
Meson has a common pattern of using 'if len(foo) == 0:' or 'if len(foo) != 0:', however, this is a common anti-pattern in python. Instead tests for emptiness/non-emptiness should be done with a simple 'if foo:' or 'if not foo:' Consider the following: >>> import timeit >>> timeit.timeit('if len([]) == 0: pass') 0.10730923599840025 >>> timeit.timeit('if not []: pass') 0.030033907998586074 >>> timeit.timeit('if len(['a', 'b', 'c', 'd']) == 0: pass') 0.1154778649979562 >>> timeit.timeit("if not ['a', 'b', 'c', 'd']: pass") 0.08259823200205574 >>> timeit.timeit('if len("") == 0: pass') 0.089759664999292 >>> timeit.timeit('if not "": pass') 0.02340641999762738 >>> timeit.timeit('if len("foo") == 0: pass') 0.08848102600313723 >>> timeit.timeit('if not "foo": pass') 0.04032287199879647 And for the one additional case of 'if len(foo.strip()) == 0', which can be replaced with 'if not foo.isspace()' >>> timeit.timeit('if len(" ".strip()) == 0: pass') 0.15294511600222904 >>> timeit.timeit('if " ".isspace(): pass') 0.09413968399894657 >>> timeit.timeit('if len(" abc".strip()) == 0: pass') 0.2023209120015963 >>> timeit.timeit('if " abc".isspace(): pass') 0.09571301700270851 In other words, it's always a win to not use len(), when you don't actually want to check the length.
Diffstat (limited to 'mesonbuild/interpreterbase.py')
-rw-r--r--mesonbuild/interpreterbase.py14
1 files changed, 7 insertions, 7 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py
index e59557a..86a6b47 100644
--- a/mesonbuild/interpreterbase.py
+++ b/mesonbuild/interpreterbase.py
@@ -34,7 +34,7 @@ def check_stringlist(a, msg='Arguments must be strings.'):
def noPosargs(f):
@wraps(f)
def wrapped(self, node, args, kwargs):
- if len(args) != 0:
+ if args:
raise InvalidArguments('Function does not take positional arguments.')
return f(self, node, args, kwargs)
return wrapped
@@ -42,7 +42,7 @@ def noPosargs(f):
def noKwargs(f):
@wraps(f)
def wrapped(self, node, args, kwargs):
- if len(kwargs) != 0:
+ if kwargs:
raise InvalidArguments('Function does not take keyword arguments.')
return f(self, node, args, kwargs)
return wrapped
@@ -94,7 +94,7 @@ class InterpreterBase:
raise InvalidArguments('Missing Meson file in %s' % mesonfile)
with open(mesonfile, encoding='utf8') as mf:
code = mf.read()
- if len(code.strip()) == 0:
+ if code.isspace():
raise InvalidCode('Builder file is empty.')
assert(isinstance(code, str))
try:
@@ -113,7 +113,7 @@ class InterpreterBase:
def sanity_check_ast(self):
if not isinstance(self.ast, mparser.CodeBlockNode):
raise InvalidCode('AST is of invalid type. Possibly a bug in the parser.')
- if len(self.ast.lines) == 0:
+ if not self.ast.lines:
raise InvalidCode('No statements in code.')
first = self.ast.lines[0]
if not isinstance(first, mparser.FunctionNode) or first.func_name != 'project':
@@ -405,7 +405,7 @@ class InterpreterBase:
obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'to_string':
- if len(posargs) == 0:
+ if not posargs:
if obj:
return 'true'
else:
@@ -429,12 +429,12 @@ class InterpreterBase:
obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'is_even':
- if len(posargs) == 0:
+ if not posargs:
return obj % 2 == 0
else:
raise InterpreterException('int.is_even() must have no arguments.')
elif method_name == 'is_odd':
- if len(posargs) == 0:
+ if not posargs:
return obj % 2 != 0
else:
raise InterpreterException('int.is_odd() must have no arguments.')