根据PEP8,编写标识类名(而不是实例)的变量的约定是什么?
也就是说,给定两个类A和B,以下哪一种陈述是正确的?
target_class = A if some_condition else B
instance = target_class()或
TargetClass = A if some_condition else B
instance = TargetClass()
如样式指南中所述,
类名:
类名通常应该使用CapWords约定。
但同时也
方法名称和实例变量:
根据需要使用函数命名规则:小写,单词之间用下划线分隔,以提高可读性。
在我看来,这两个惯例是冲突的,我找不到哪一个占上风。
发布于 2016-07-18 18:58:06
在PEP 8中,由于缺乏对此案的具体报道,人们可以为奖牌的两面都编造一个论点:
一方面是:因为A和B都是变量,但是持有对类的引用,在本例中使用CamelCase (TargetClass)。
没有什么能阻止你去做
class A: pass
class B: pass
x = A
A = B
B = x现在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))在这种情况下,cls显然是非常临时的状态,而且显然是一个变量;每次调用都可以是不同的。所以应该是lower_case。
示例2:类的别名
class OldAPI: pass
class NewAPI: pass
class ThirdAPI: pass
CurrentAPI = ThirdAPI在这种情况下,CurrentAPI将被视为另一个别名的一种类型,并且在整个程序运行过程中保持不变。在这里,我更喜欢CamelCase。
发布于 2016-07-21 02:24:14
我个人认为,无论您提到的包含对类的引用的变量是定义为临时变量(例如,在过程或函数中)还是定义为全局谱中现有类的派生,在使用哪一个的情况下具有最大的权重。因此,从上面的答复中总结如下:
lower_case,并用下划线分隔。发布于 2016-07-26 23:42:17
如果有疑问,我会和Python开发人员做同样的事情。毕竟他们写了PEP-8。
你可以考虑你的线路:
target_class = A if some_condition else B作为模式的内联形式:
target_class = target_class_factory()在使用CamelCase的Python库中有一个众所周知的例子,namedtuple。
https://stackoverflow.com/questions/38433503
复制相似问题