diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2017-05-01 15:11:01 -0700 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2017-05-02 21:57:26 +0300 |
commit | a8173630eac1f35914fdc2d918a636ac268b9033 (patch) | |
tree | c971b7e0be066df5a2a77f1141eb1517dd3903ef /mesonbuild/interpreterbase.py | |
parent | ae924b01a006bc1542fe7eaae1d8a933459e8a0a (diff) | |
download | meson-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.py | 14 |
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.') |