gpt4 book ai didi

python - 接受扩展参数和元组的函数

转载 作者:太空狗 更新时间:2023-10-29 20:51:09 26 4
gpt4 key购买 nike

是否有 Pythonic 方法来创建接受单独参数和元组的函数?即实现这样的目标:

def f(*args):
"""prints 2 values
f(1,2)
1 2
f( (1,2) )
1 2"""
if len(args) == 1:
if len(args[0]) != 2:
raise Exception("wrong number of arguments")
else:
print args[0][0],args[0][1]
elif len(args) == 2:
print args[0],args[1]
else:
raise Exception("wrong number of arguments")

最佳答案

首先我不知道这样做是否非常明智。假设有人调用如下函数:

f(*((1,4),(2,5)))

如您所见,元组包含两个元素。但是现在由于某种原因,这个人只用一个元素调用它(因为例如生成器没有生成两个元素):

f(*((1,4),))

然后用户可能希望您的函数报告这个,但现在它只会接受它(这可能导致复杂和意外的行为)。好的,打印元素当然不会造成太大伤害。但在一般情况下,后果可能更严重。

尽管如此,一种优雅的方法是制作一个简单的装饰器,它首先检查是否有一个元素被提供,然后检查是否有一个元组元素被提供,如果是则扩展它:

def one_tuple(f):
def g(*args):
if len(args) == 1 and isinstance(args[0],tuple):
return f(*args[0])
else:
return f(*args)
return g

并将其应用于您的f:

@one_tuple
def f(*args):
if len(args) == 2:
print args[0],args[1]
else:
raise Exception("wrong number of arguments")

装饰器 one_tuple 因此检查是否有一个元组被提供,如果是,则在将它传递给您的 f 函数之前为您解包

因此 f 不必考虑元组的大小写:它总是会被提供扩展参数并处理这些(当然也可以做相反的事情)以及)。

定义装饰器的优点是它的重用:您可以将此装饰器应用于所有类型的函数(从而更容易实现这些函数)。

关于python - 接受扩展参数和元组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41898491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com