接受整数的int或元组作为python函数参数

时间:2018-02-16 15:37:42

标签: python python-3.x

我有以下功能:

def port_status(self, port=(1, 2)):
    for i in port:
        print_status(i)

但我希望用户能够使用单个端口号调用该函数,如下所示:

port_status(port=2)

在这种特定情况下,它最终会如下所示:

TypeError: 'int' object is not iterable

我可以在这里使用一些蟒蛇魔法吗?

3 个答案:

答案 0 :(得分:6)

您可以查看port的类型。

def port_status(self, port=(1, 2)):
    if isinstance(port, int):
        port = (port,)
    for i in port:
        print_status(i)

答案 1 :(得分:0)

没有什么神奇之处,但一般来说,你通过试图找出输入是否按预期方式运行来生活。这可以与尝试以您想要的方式预先处理它们相结合。

例如,您可以将您的功能修改为:

def port_status(self, port)
    ports = validate_ports(port)
    for p in ports:
        # use p as individual port

其中,在函数validate_ports中,您可以使用try块暂时找出(并可能桥接)所需行为和实际行为,这是一个非常粗略的例子:

def validate_ports(port):
    try:
        portiter = iter(port)
    except TypeError:
        return [port]
    return list(portiter)

此函数始终返回一个列表,因此在输入是int s或int的有效列表的情况下,没有任何内容。但是,尽管有名称,个别成员仍然可能表现不佳,并且您需要在其余代码中处理异常。

一般来说,using isinstance can be unwieldy使用Python的鸭子类型,以及诸如“int s序列”之类的概念在Python中并不是真正可执行的。您可以选择将LBYLEAFP混合使用,或者选择纯粹主义,这种选择非常主观,可能会被描述为“魔术”。

答案 2 :(得分:-1)

您的for in port需要将端口作为可迭代对象。所以你可以通过port_status port =(2),它会工作。