Python不限制的参数名称,但有些参数名称强烈约定管辖,比如self,cls,args,和kwargs。名称self和cls始终代表相同的概念,因此在这些情况下,我很难找到令人信服的理由让某人偏离惯例。但是,对于args和kwargs,我发现这种命名约定令人窒息。
假设我有一个具有各种属性的类,可以通过将 kwargs 传递给其构造函数来设置这些属性:
class MyObj:
def __init__(self, **kwargs):
for propname in kwargs:
self.set_property(propname, kwargs[propname])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,kwargs 仅打算作为该类实例的可设置属性,因此对我而言,将定义编写如下是有意义的:
class MyObj:
def __init__(self, **properties):
for propname in properties:
self.set_property(propname, properties[propname])
Run Code Online (Sandbox Code Playgroud)
这样,人们只需要查看方法的签名即可了解 kwargs 的用途。
一般来说,我认为约定俗成是一件好事。但是,在我看来,总是使用args并且kwargs是一个错失的机会,可以向 API 用户传达有关函数/方法的 args 和 kwargs 性质的有用信息。毕竟,它们是未命名或命名参数的事实已经通过单星号或双星号的存在清楚地表明。
有没有人有在现实世界的多开发人员代码中使用 args 和 kwargs 的替代名称的示例,或者对这些构造使用其他变量名称是否太违背了原则?
如果不使用这些传统名称真的只是一个可怕的、可怕的想法,那是什么原因呢?
我开始学习Python中的类型提示,以简化将来从Python到C的代码移植。我想知道直接在类型提示中使用类型与使用typing模块中定义的类之间的区别(如果有)。
例如,
def somefn(a: list[int]) -> tuple[str, int]:
...
Run Code Online (Sandbox Code Playgroud)
和
from typing import List, Tuple
def somefn(a: List[int]) -> Tuple[str, int]:
...
Run Code Online (Sandbox Code Playgroud)
这似乎是一些类一样Union,Any,Callable,并且Iterable是有用的,但已经作为关键字在python中存在类数据类型的工具我不清楚。