在threading.py中的奇怪参数
在threading.py中的奇怪参数
函数参数中的一个裸星号(bare asterisk)有什么作用?
当我查看pickle模块时,我看到了这样的内容:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
我了解单个和双个星号前置参数(用于可变数量的参数),但是这个星号前面没有任何东西。我很确定这与pickle无关,这可能只是一个例子。当我将其发送给解释器时,我才知道它的名字:
>>> def func(*): ... pass ... File "", line 1 SyntaxError: named arguments must follow bare *
如果有关系的话,我使用的是Python 3.3.0版本。
Odd argument in threading.py问题的出现原因是函数定义中使用了*
作为参数,但没有后续的关键字参数。在Python中,*
被用作强制调用者使用命名参数的方式,因此当没有后续的关键字参数时,不能定义带有*
作为参数的函数。
解决方法是使用命名参数来替代*
。具体可以参考Python 3官方文档中的说明。
另外,有一个Stack Overflow的答案和讨论提供了关于这个问题的详细解释,并附有代码示例。同时,还有一个相关的讨论提到了def foo(a, *, **kwargs)
也会返回相同的语法错误,这也引起了一些人的兴趣。
此外,还有一个关于这个的问题记录在Python的官方bug追踪系统中。
总结起来,Odd argument in threading.py问题的原因是函数定义中使用了*
作为参数,但没有后续的关键字参数。解决方法是使用命名参数来替代*
。
问题的出现原因是函数调用时传入的参数与函数定义时的参数不匹配,导致抛出不同的类型错误或语法错误。具体来说,出现的错误类型包括TypeError和SyntaxError。
解决方法是根据错误提示,调整函数调用时传入的参数,使其与函数定义时的参数一致。
首先,在第一个例子中,func函数定义时使用了关键字参数,因此函数调用时需要指定参数名。但是在第一个函数调用中,参数"gg"没有指定参数名,导致TypeError: func() takes 0 positional arguments but 1 was given错误。在第二个函数调用中,缺少了一个必需的关键字参数'b',导致TypeError: func() missing 1 required keyword-only argument: 'b'错误。在第三个函数调用中,多传入了一个未定义的关键字参数'c',导致TypeError: func() got an unexpected keyword argument 'c'错误。在第四个函数调用中,位置参数"cc"跟在关键字参数'b'之后,导致SyntaxError: positional argument follows keyword argument错误。只有在第五个函数调用中,正确传入了两个关键字参数'a'和'b',输出了正确的结果。
在第二个例子中,func函数定义时除了关键字参数'a'和'b'之外,还接受任意数量的关键字参数,使用了**kwargs来表示。因此,在第六个函数调用中,除了传入了正确的关键字参数'a'和'b'之外,还传入了一个额外的关键字参数'c',输出了正确的结果。
要避免出现这些错误,需要在函数调用时确保传入的参数与函数定义时的参数匹配,并且正确使用关键字参数和位置参数。
问题:Odd argument in threading.py
原因:在Python中,*参数的作用是强制后续参数只能以关键字方式传递,而不能以位置参数的方式传递。但是线程模块(threading.py)中出现了一个奇怪的参数*args。
解决方法:将参数*args改为可选的关键字参数。
在Python中,有一个问题被称为"Odd argument in threading.py"。这个问题发生在线程模块(threading.py)中,原因是在代码中出现了一个奇怪的参数*args。为了解决这个问题,我们需要了解一下*参数的作用。
在Python中,*参数的作用是强制后续参数只能以关键字方式传递,而不能以位置参数的方式传递。这个行为来源于PEP-3102。根据相关部分的描述,*参数的意思是允许函数的关键字参数在没有指定参数名称的情况下被省略。换句话说,要为key参数传递值,你需要显式地以key="value"的形式传递。
所以,实际上,拥有一个参数*就像拥有一个参数args*,但是由于你没有给它命名,它的唯一效果可能是悄悄地吞噬掉所有剩余的位置参数,以强制剩下的参数只能以关键字的方式传递。
有人可能会认为,*参数的效果是吞噬掉剩余的位置参数,但事实并非如此。如果传递了多余的位置参数,函数会报错,错误信息类似于"foo() takes exactly 1 positional argument (2 given)"。
为了更好地理解*参数的作用,我们可以在PEP中添加一个示例:"As a convenient shortcut, we can simply omit the 'ignore' name, meaning 'don't allow any positional arguments beyond this point'." 这个示例清楚地说明了*参数的作用。
解决Odd argument in threading.py问题的方法是将参数*args改为可选的关键字参数。通过这种方式,我们可以避免出现奇怪的参数*args,同时保证函数的关键字参数能够按照预期方式进行传递。