我有以下功能:
def port_status(self, port=(1, 2)):
for i in port:
print_status(i)
但我希望用户能够使用单个端口号调用该函数,如下所示:
port_status(port=2)
在这种特定情况下,它最终会如下所示:
TypeError: 'int' object is not iterable
我可以在这里使用一些蟒蛇魔法吗?
答案 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中并不是真正可执行的。您可以选择将LBYL与EAFP混合使用,或者选择纯粹主义,这种选择非常主观,可能会被描述为“魔术”。
答案 2 :(得分:-1)
您的for in port需要将端口作为可迭代对象。所以你可以通过port_status port =(2),它会工作。