我有一个Python函数,它可以返回两种类型的返回值之一,animal
或food
。两者都是字符串类型。现在,我通过总是返回两个值来区分这两个值,断言它们只有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
必须有更好的方法来处理这个问题。有什么选择?
答案 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