请问在Python函数中的字符串会影响到函数形参吗
我在学习Python文档的Python教程中的4.8.3.4. 函数示例时,遇到了如下情况:
下面的函数定义中,
kwds
把name
当作键,因此,可能与位置参数name
产生潜在冲突:def foo(name, **kwds): return 'name' in kwds
调用该函数不可能返回
True
,因为关键字'name'
总与第一个形参绑定。例如:>>>foo(1, **{'name': 2}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() got multiple values for argument 'name' >>>
加上 / (仅限位置参数)后,就可以了。此时,函数定义把
name
当作位置参数,'name'
也可以作为关键字参数的键:>>>def foo(name, /, **kwds): ...return 'name' in kwds ... >>>foo(1, **{'name': 2}) True
换句话说,仅限位置形参的名称可以在 **kwds 中使用,而不产生歧义。
我主要不理解这一段:
下面的函数定义中,
kwds
把name
当作键,因此,可能与位置参数name
产生潜在冲突:def foo(name, **kwds): return 'name' in kwds
为何在这里函数中的字符串会影响到函数形参?
而又为何在加上 / (仅限位置参数)的限制后,就允许name 当作位置参数,’name’ 也可以作为关键字参数的键了?
首先,
def foo(*args)
和def foo(**kwds)
这个是python的可变参数写法,args 表示传入的多个位置参数, kwds 表示传入的多个关键字参数,正常它是这么用的 :然后
/
是什么意思呢? 通常, python 参数既可以按参数位置传, 也可以按参数名字传. 但是如果加了/
那么/
前面的参数就只能按位置传,比如下面这样:然后楼主提的问题中, 如果第一个位置参数是 nane, 然后可变参数又传一个 name。 那么相当于调用的时候传了两个 name, 它就会冲突。 之所以这样,是因为这个 name 它既可以是位置参数, 也可以是关键字参数。 那么我们在后面加一个
/
说明 name 只能按位置传,它就不会起冲突了:然后正常来说, 为了代码的可读性, 写方法的时候是应该明确的定义方法的参数。 可变参数一般是用来写
decorator
的, 就是修改方法的方法, 比如装饰器。 如果不好理解的话可以看一下下面的例子。可以看到, 正常
test_6
是按照位置顺序打印它的所有参数的。 我们定义了一个装饰器修改了test_6
的行为,使其按照和原来相反的顺序打印参数。如果解决了你的问题, 给我点个赞, 加点点声望, 感谢 ~