What should I use instead of assignment-in-an-expression in Python?
Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Puzzle Meditation
--
Chapters
00:00 Question
00:44 Accepted answer (Score 12)
01:42 Answer 2 (Score 4)
02:32 Answer 3 (Score 3)
03:00 Answer 4 (Score 2)
03:45 Thank you
--
Full question
https://stackoverflow.com/questions/1513...
Question links:
[this page]: http://pyfaq.infogami.com/why-can-t-i-us...
Accepted answer links:
[recipe]: http://books.google.com/books?i
[here]: http://code.activestate.com/recipes/6606.../
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python
#avk47
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Puzzle Meditation
--
Chapters
00:00 Question
00:44 Accepted answer (Score 12)
01:42 Answer 2 (Score 4)
02:32 Answer 3 (Score 3)
03:00 Answer 4 (Score 2)
03:45 Thank you
--
Full question
https://stackoverflow.com/questions/1513...
Question links:
[this page]: http://pyfaq.infogami.com/why-can-t-i-us...
Accepted answer links:
[recipe]: http://books.google.com/books?i
[here]: http://code.activestate.com/recipes/6606.../
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python
#avk47
ANSWER 1
Score 4
Another alternative which offers some flexibility:
# Functions to be tested (can be expanded):
tests = [something, somethingelse, yetsomethingelse, anotherfunction, another]
for i, f in enumerate(tests):
a = f()
if a:
if i == 0:
# do something with a
elif 1 <= i <= 3:
# do something else with a
else:
# ...
break
Or you can explicitly compare to the function:
tests = [something, somethingelse, yetsomethingelse, anotherfunction, another]
for i, f in enumerate(tests):
a = f()
if a: break
if not a:
# no result
elif f == something:
# ...
elif f == somethingelse:
# ...
If some of the functions take arguments, you can use lambda to keep the function paradigm:
tests = [lambda: something(args), somethingelse, lambda: something(otherargs)]
for i, f in enumerate(tests):
a = f()
if a: break
if not a:
# no result
elif i == 0:
# ...
elif i == 1:
# ...
ANSWER 2
Score 3
You could do this:
a = something()
if a:
#do something with a
else:
a = somethingelse()
if a:
#...
else:
#5 more nested ifs
Or, inside a function you can limit the nesting level with a return in each matching case:
def f():
a = something()
if a:
#do something with a
return
a = somethingelse()
if a:
#...
return
#5 more ifs
ANSWER 3
Score 2
Make yourself a simple callable object that saves its returned value:
class ConditionValue(object):
def __call__(self, x):
self.value = x
return bool(x)
Now use it like this:
# example code
makelower = lambda c : c.isalpha() and c.lower()
add10 = lambda c : c.isdigit() and int(c) + 10
test = "ABC123.DEF456"
val = ConditionValue()
for t in test:
if val(makelower(t)):
print t, "is now lower case ->", val.value
elif val(add10(t)):
print t, "+10 ->", val.value
else:
print "unknown char", t
Prints:
A is now lower case -> a
B is now lower case -> b
C is now lower case -> c
1 +10 -> 11
2 +10 -> 12
3 +10 -> 13
unknown char .
D is now lower case -> d
E is now lower case -> e
F is now lower case -> f
4 +10 -> 14
5 +10 -> 15
6 +10 -> 16
ANSWER 4
Score 1
You could use a decorator like this memorise for those functions - assuming they always return the same value. Notice that you can call expensive_foo and expensive_bar as many times as you like and the function body only ever gets executed once
def memoize(f):
mem = {}
def inner(*args):
if args not in mem:
mem[args] = f(*args)
return mem[args]
return inner
@memoize
def expensive_foo():
print "expensive_foo"
return False
@memoize
def expensive_bar():
print "expensive_bar"
return True
if expensive_foo():
a=expensive_foo()
print "FOO"
elif expensive_bar():
a=expensive_bar()
print "BAR"