返回两种类型的字符串中的一种

时间:2015-06-30 22:14:03

标签: python class return return-value

我有一个Python函数,它可以返回两种类型的返回值之一,animalfood。两者都是字符串类型。现在,我通过总是返回两个值来区分这两个值,断言它们只有True

def help(x):
    if some_condition(x):
        return 'monkey', None
    elif # ...
        animal = some_fantasy_animal(x)
        return animal, None
    elif #..
        food = some_food_no_one_has_ever_heard_of(x)
        return None, food
    elif # ...
        return None, 'steak'
    # ...



def main():
    animal, food = help('ddd')
    if animal:
        assert(not food)
        # do something useful
        pass
    else:
        assert(food)
        # do something useful
        pass
    return

必须有更好的方法来处理这个问题。有什么选择?

4 个答案:

答案 0 :(得分:1)

您的情景有点奇怪

您可能想要创建一个Animal类和一个Food类,并让它们派生自一些常见的基类。然后,您可以使用isinstance或更好,忘记if条件并调用基类中定义的方法,您可以为每种类型覆盖该方法。

如果Food和Animal之间没有共性,那么你可能不应该有一个可以返回任何一种类型的函数。

答案 1 :(得分:0)

好吧,你可以制作一套动物和食物,如:

animals={'hippo', 'monkey'}
food={'bananas', 'steak'}

然后与in运营商核对:

h = help('ddd')

if h in animals:
    ...
elif h in food:
    ...

答案 2 :(得分:0)

这可能是一个解决方案。将数据表示为:

data = {'animal':['cat','dog'], 'food':['steak','egg']}

检查某个值x是否为动物或食物:

t = [k for k, v in data.iteritems() if x in data[k]]
然后

t将包含特定项目所属的类。请注意,如果animal也作为food出现,那么t将包含两者。有点灵活!

答案 3 :(得分:0)

你可以创建一个类,它接受参数传递所有引用的逻辑来确定里面的类型:

例如:

class Result(object):
  def __init__(self, animal=None, food=None):
    self.animal = animal
    self.food = food 

  @property
  def is_animal(self):
    return self.animal != None

  @property
  def is_food(self):
    return self.food != None

def help(x):
  if x == 1:
    return Result(animal='monkey')
  elif x == 2:
    return Result(animal='hippo')
  elif x == 3:
    return Result(food='bananas')
  else:
    return Result()

if __name__ == '__main__':
  result = help(3)
  if result.is_animal:
    print result.animal
  if result.is_food:
    print result.food