下面是在builtins.pyi
def max(__arg1: _T, __arg2: _T, *_args: _T, key: Callable[[_T], SupportsLessThan]) -> _T:
我确实知道名称修饰的含义,并且知道名称修饰将影响类定义字段中的每个“__xxx”标识符。
所以我有三个问题:
- 为什么参数“_ arg1”“arg2”使用“__xxx”模式而参数“key”不使用;
- 函数参数或本例中专门使用的“__xxx”模式的功能和用途是什么;
- 我觉得很难找到名称修改的实现,你能告诉我它在 cpython 源代码中的位置吗?
非常感谢。
进一步的工作:
def wat1(__a):
def wat2(__b):
return __b, __a
return __a
print(wat1.__code__.co_varnames)
print(wat1.__code__.co_cellvars)
dis.dis(wat1)
输出(linux python==3.10.8):
('__a', 'wat2')
('__a',)
21 0 LOAD_FAST 0 (__a)
2 RETURN_VALUE
22 0 LOAD_FAST 0 (__b)
2 LOAD_DEREF 0 (__a)
4 BUILD_TUPLE 2
6 RETURN_VALUE
名称修饰仅适用于类定义中使用的名称,不适用于函数参数。在这种情况下,前导下划线只是一种命名约定,用于指示具有此类名称的参数不能与关键字参数一起传递,而只能与位置参数一起传递。
这就是说你应该打电话max
with:
max(1, 2)
而不是:
max(__arg1=1, __arg2=2)
The key
另一方面,参数的命名不带下划线前缀,表明它应该与关键字参数一起传递:
max(1, -2, key=abs)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)