Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回两种类型的字符串之一_Python_Class_Return_Return Value - Fatal编程技术网

Python 返回两种类型的字符串之一

Python 返回两种类型的字符串之一,python,class,return,return-value,Python,Class,Return,Return Value,我有一个Python函数,它可以返回两种类型的返回值之一,animal或food。两者都是字符串类型。现在,我通过始终返回两个值来区分这两个值,并断言其中只有为True: def help(x): if some_condition(x): return 'monkey', None elif # ... animal = some_fantasy_animal(x) return animal, None elif #..

我有一个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

一定有更好的方法来处理这个问题。有哪些选择?

您的场景有点奇怪

您可能希望创建一个Animal类和一个Food类,并让它们派生自一些公共基类。然后,您可以使用
isinstance
或更好的方法,忘记
if
条件并调用在基类中定义的方法,您可以为每种类型重写该方法


如果食物和动物之间没有共同点,那么您可能不应该有一个函数可以返回任何一种类型。

那么,您可以创建一组动物和食物,如:

animals={'hippo', 'monkey'}
food={'bananas', 'steak'}
然后在操作员中检查

h = help('ddd')

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

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

data = {'animal':['cat','dog'], 'food':['steak','egg']}
要检查某个值
x
是否为动物或食物:

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

t
将包含特定项所属的类。请注意,如果
动物
也作为
食物
,则
t
将同时包含这两种。有点灵活

您可以创建一个类,该类接受参数并传递所有引用的逻辑,以确定内部类型:

例如:

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

也许要一本字典?键将指示类型。似乎有多种方法可以做到这一点。@Noob是的……你可以使用字典来创建单词和类型之间的映射。这可能更简单。什么是动物和食物?实际上,我用来构建配置文件的字符串。根据不同的类型,他们承担不同的角色。
animal
-
food
隐喻就是要抽象掉这一点。它们是一个类的实例吗?是的,它们都是
string
s。好吧,我明白你在做什么,我会用类来区分你的对象,让你的生活更轻松。我无法提供一个全面的
food
animal
列表。根据
x
,它们可以假设任何值。我们如何知道某个字符串是动物还是食物?嗯,
help()
知道。暴露这些信息是问题的关键。我无法提供一套全面的
食品
s或
动物
s。它们可以采用任何值,具体取决于
x