Python:PEP 8类名作为变量

Los*_*ses 20 python pep8

根据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 AB两者都是变量,但是对类进行引用,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.


VPf*_*PfB 5

如果有疑问,我会像 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。