significance
significance

Reputation: 5105

how do i get the value of a function i'm using in an if condition in python?

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

Answers (5)

Mark Longair
Mark Longair

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

Odomontois
Odomontois

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

Rafe Kettler
Rafe Kettler

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

Gareth McCaughan
Gareth McCaughan

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

Mike Lewis
Mike Lewis

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

Related Questions