【问题标题】:Return one of two types of strings返回两种类型的字符串之一
【发布时间】:2015-09-17 21:52:26
【问题描述】:

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

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

【问题讨论】:

  • 什么是动物和食物?
  • 实际上,我用于构建配置文件的字符串。根据类型,它们承担不同的角色。 animal-food 的隐喻就是抽象掉这个。
  • 它们是类的实例吗?
  • 是的,他们都是strings。
  • 好的,我明白你在做什么,我会使用类来区分你的对象,让你的生活更轻松。

标签: python class return return-value


【解决方案1】:

你的场景有点奇怪

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

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

【讨论】:

  • 可能是一本字典?键将指示类型。似乎有多种方法可以做到这一点。
  • @Noob 是的...您可以使用字典来创建单词和类型之间的映射。这可能更简单。
【解决方案2】:

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

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 将同时包含两者。有点灵活!

【讨论】:

  • 我无法提供foodanimal 的完整列表。它们可以采用任何值,具体取决于x
  • 我们如何知道一个特定的字符串是动物还是食物?
  • 好吧,help() 知道。公开这些信息就是问题所在。
【解决方案3】:

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

例如:

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

【讨论】:

    【解决方案4】:

    好吧,您可以创建一组动物和食物,例如:

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

    然后与in运营商核对:

    h = help('ddd')
    
    if h in animals:
        ...
    elif h in food:
        ...
    

    【讨论】:

    • 我无法提供完整的一组foods 或animals。它们可以采用任何值,具体取决于x
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多