Reputation: 5105
how do i get the value of a function i'm using to trigger an if condition in python?
something like...
def is_a_banana(a):
if a == "Banana":
return True
else:
return False
v = "Banana"
if ban = is_a_banana(v):
print ban
>> True
i know i could just split it into...
ban = is_a_banana(v)
if ban:
print ban
but i'm trying to rewrite the following in an efficient way so that i can get the returned values of the functions out. in php i could just bind the output to a variable, is their any way to do this with python?
if s.real_quick_ratio() >= cutoff and \
s.quick_ratio() >= cutoff and \
s.ratio() >= cutoff:
result.append((s.ratio(), x))
Upvotes: 0
Views: 134
Reputation: 467121
Update: other answers satisfactorily explained why you can't do what you want directly in Python - I added this just to show that a version that only calculates each ratio a minimum number of times (so still has good performance) is still readable and clear...
Personally, I think this is pretty clear:
if s.real_quick_ratio() >= cutoff and s.quick_ratio() >= cutoff:
r = s.ratio()
if r >= cutoff:
result.append((r, x))
Upvotes: 4
Reputation: 16308
Maybe this can be handled by enabling caching inside function(or decorator) like:
class Factorial(object):
def __init__(self,arg):
self.arg = arg
@property
def value(self):
if self.arg == 1 : return 1
else: return self.arg * Factorial(self.arg - 1).value
class CachedFactorial(Factorial):
@property
def value(self):
if not hasattr(self,'_value'):
self._value = super(CachedFactorial,self).value
return self._value
Upvotes: 0
Reputation: 76955
Assignment does not return a value in Python. It's actually not an expression, but a statement rather, so it always has to be by itself. That will never change. It's mainly a design decision by the Python developers; they found that that particular idiom in C made code less readable so it was left out (there's also some speculation that it was left out to avoid mixups between =
and ==
, but I don't buy that).
You can write the second form if you'd like, or you can work out a different way to do what you need.
Upvotes: 3
Reputation: 19971
You should do it the simple way: assign explicitly to a variable and look at the value of the variable.
You could do something like this:
def save(box,name,value):
box[name] = value
return value
box = {}
if save(box,'real_quick',s.real_quick_ratio()) >= cutoff \
and save(box,'quick',s.quick_ratio()) >= cutoff \
and save(box,'ratio',s.ratio()) >= cutoff:
# do something with box['ratio']
but it's horrible. Why not just make s.ratio() cache the value it's computing?
Upvotes: 1
Reputation: 64137
You simply can not do this beause in Python this
ban = is_a_banana(v)
is a statement, not an expression, thus is doesn't return a value that you can check on.
Keep it how it is, because not only is it readable but it also works.
Upvotes: 0