使用splat操作符传递可选参数并没有按预期工作

2024-04-19 22:57:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个泛型函数,它接受2个参数(int)作为a和B作为必需参数,另外2个作为可选参数;这是函数signatute

myfunct(a, b, c=False, d="joe")

a和b是int,c是bool,d是str类型。你知道吗

我正在使用splat操作符传递一个列表,因此根据我从argparse获得的参数数量,我可以添加可选参数,也可以不添加。有时我会得到对函数的调用

myfunct 21, 32

有时作为

myfunct 34, 44, c=True

以及其他的变种

尽管我注意到splat函数没有正确地传递可选参数。相反,它按顺序传递参数,即使我指定使用哪个可选参数。你知道吗

thelist = [21, 32, "d="+"mike"]

myfunct(*thelist]

当我查看函数中每个变量的内容时,我正确地得到了ab,但不是在d可选参数中得到mike,而是在c中得到它,它分配整个字符串,而不是只分配=符号后面的内容

这就是变量的内容:

a -> 21
b -> 32
c -> d=mike

在我期待的时候

a -> 21
b -> 32
d -> mike

如何使用splat运算符传递可选参数?或者从这个开始是个坏主意?你知道吗


Tags: 函数false类型内容参数int型函数bool
2条回答

通过dict给出关键字参数(kwargs),用**展开:

args = [21, 32]
kwargs = {"d": "mike"}
myfunct(*args, **kwargs)

虽然可以为位置参数(显然你已经弄明白了)解包一个列表,但是对于关键字参数,你需要一个字典。你知道吗

args = [21, 32]
kwargs = {"c": "mike"}

def test_function(a, b, c=None):
    print(a, b, c)

test_function(*args, **kwargs)
# (21, 32, 'mike')

这并不是一个天生的坏主意,但是当你做这样的事情时,一定要记住它会对查看你的代码的人的可读性产生怎样的影响(包括你自己在这之后的几个月里已经不再是新鲜的了)。你知道吗

相关问题 更多 >