首页 > 解决方案 > 将元素或元素数组作为参数传递的统一方式

问题描述

这是一个关于一般编程的问题,更准确地说是关于 python 的问题:我想将一个参数传递给一个函数,该函数有时是一个类型,有时是一个相同类型的数组。我还想编写函数的主体,以便在它只有一个元素时对那个元素执行某些操作,并逐点对每个元素执行此操作,并在它是数组时返回它们的列表。

编辑:让我补充一下,我现在正在使用

def foo(cards):
    if isinstance(cards, list) == False :
            cards = [cards]

    for card in cards:
        my_stuff

但对我来说它看起来不太像pythonic,我想知道是否有另一种使用解包*或其他运算符的方法。谢谢!

标签: python

解决方案


这是多态性的一个很好的例子

您可以尝试迭代它,如果失败假设这是一个单一的值

def somefunc(value):
    try:
        for v in value:
            dosomething(v)
    except TypeError:
        dosomething(value)

你也可以使用 isinstance 来测试是否是一个列表

def somefunc(value):
    if isinstance(value, list):
        for v in value:
             dosomething(v)
    else:
        dosomething(value)

第一种方法更pythonic,也更通用

- 编辑 -

只是扩展我的答案。第一个示例更通用,因为它尝试迭代值而不是尝试检查它的类型。除了列表之外,python 中还有更多可迭代的东西,例如,迭代 dics,给你键,迭代文件,给你行,迭代生成器给你生成的值,等等。当您检查一个类型时,只有该类型及其子类型可以工作,但是当尝试迭代它时,任何实现迭代器协议的东西都可以工作。

这就是背后的“请求原谅优于请求许可”原则。作为一种鸭子类型的语言,尝试行为比子类型更普遍,我希望这会有所帮助


推荐阅读