根据PEP 8,编写用于标识类名(而非实例)的变量的约定是什么?
也就是说,给出了两个班,A并且B,它下面的语句是正确的?
target_class = A if some_condition else B
instance = target_class()
Run Code Online (Sandbox Code Playgroud)
要么
TargetClass = A if some_condition else B
instance = TargetClass()
Run Code Online (Sandbox Code Playgroud)
班级名称:
类名通常应使用CapWords约定.
但是也
方法名称和实例变量:
使用函数命名规则:小写,必要时用下划线分隔,以提高可读性.
在我看来,这两个公约发生了冲突,我无法找到哪一个盛行.
glg*_*lgl 11
由于在PEP 8中缺乏对此案例的具体描述,人们可以为奖牌的双方构成争论:
一方面是:As A和B两者都是变量,但是对类进行引用,TargetClass在这种情况下使用CamelCase().
没有什么能阻止你这样做
class A: pass
class B: pass
x = A
A = B
B = x
Run Code Online (Sandbox Code Playgroud)
现在A,B分别指向其他类,所以它们并没有真正固定在类中.
所以A并且B有唯一的责任来举办一个班级(无论他们有相同的名字或不同的名字),所以也是如此TargetClass.
为了保持不偏不倚,我们也可以用另一种方式争论:A并且B只要它们与它们的类一起创建就是特殊的,并且类的内部具有相同的名称.到目前为止,它们有点"原始",任何其他任务都应该被标记为特殊的,因为它们被视为一个变量,因而在lower_case.
事实就是如此,中间的某个地方.有些情况下,我会走一条路,而其他地方则会走另一条路.
示例1:您将一个可能应该实例化的类传递给方法或函数:
def create_new_one(cls):
return cls()
class A: pass
class B: pass
print(create_new_one(A))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,cls显然是非常临时的状态,显然是一个变量; 每次通话都会有所不同.所以它应该是lower_case.
示例2:类的别名
class OldAPI: pass
class NewAPI: pass
class ThirdAPI: pass
CurrentAPI = ThirdAPI
Run Code Online (Sandbox Code Playgroud)
在这种情况下,CurrentAPI将被视为另一种别名的一种别名,并在整个程序运行期间保持不变.在这里,我更喜欢CamelCase.
如果有疑问,我会像 Python 开发人员那样做。毕竟他们写了 PEP-8。
您可以考虑您的线路:
target_class = A if some_condition else B
Run Code Online (Sandbox Code Playgroud)
作为模式的内联形式:
target_class = target_class_factory()
Run Code Online (Sandbox Code Playgroud)
Python 库中有一个著名的示例,namedtuple ,它使用 CamelCase。