首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: PEP 8类名作为变量

Python: PEP 8类名作为变量
EN

Stack Overflow用户
提问于 2016-07-18 17:45:48
回答 4查看 5.1K关注 0票数 25

根据PEP8,编写标识类名(而不是实例)的变量的约定是什么?

也就是说,给定两个类AB,以下哪一种陈述是正确的?

代码语言:javascript
复制
target_class = A if some_condition else B
instance = target_class()

代码语言:javascript
复制
TargetClass = A if some_condition else B
instance = TargetClass()

如样式指南中所述,

类名

类名通常应该使用CapWords约定。

但同时也

方法名称和实例变量:

根据需要使用函数命名规则:小写,单词之间用下划线分隔,以提高可读性。

在我看来,这两个惯例是冲突的,我找不到哪一个占上风。

EN

回答 4

Stack Overflow用户

发布于 2016-07-18 18:58:06

在PEP 8中,由于缺乏对此案的具体报道,人们可以为奖牌的两面都编造一个论点:

一方面是:因为AB都是变量,但是持有对类的引用,在本例中使用CamelCase (TargetClass)。

没有什么能阻止你去做

代码语言:javascript
复制
class A: pass
class B: pass
x = A
A = B
B = x

现在AB分别指向另一个类,所以它们实际上并不固定在这个类上。

因此,AB只负责保存一个类(不管它们是同名还是不同名),TargetClass也是如此。

为了保持公正,我们也可以用另一种方式争论:AB是特殊的,因为它们是与它们的类一起创建的,并且这两个类的内部结构具有相同的名称。到目前为止,它们是一种“原始的”,任何其他的赋值都应该被标记为特殊的,因为它们将被视为变量,从而在lower_case中。

事实往往是介于两者之间。有些情况下,我会走一条路,而另一些情况下,我会走另一条路。

示例1:将一个类传递给一个方法或函数,这个类可能需要实例化:

代码语言:javascript
复制
def create_new_one(cls):
    return cls()

class A: pass
class B: pass

print(create_new_one(A))

在这种情况下,cls显然是非常临时的状态,而且显然是一个变量;每次调用都可以是不同的。所以应该是lower_case

示例2:类的别名

代码语言:javascript
复制
class OldAPI: pass
class NewAPI: pass
class ThirdAPI: pass
CurrentAPI = ThirdAPI

在这种情况下,CurrentAPI将被视为另一个别名的一种类型,并且在整个程序运行过程中保持不变。在这里,我更喜欢CamelCase

票数 12
EN

Stack Overflow用户

发布于 2016-07-21 02:24:14

我个人认为,无论您提到的包含对类的引用的变量是定义为临时变量(例如,在过程或函数中)还是定义为全局谱中现有类的派生,在使用哪一个的情况下具有最大的权重。因此,从上面的答复中总结如下:

  • 如果变量是临时的,例如在函数内部或在解决问题的单个实例中使用,则应使用lower_case,并用下划线分隔。
  • 如果变量在全局范围内,并且与其他类一起定义为别名或派生,则应使用别名或派生在程序体中创建对象
票数 2
EN

Stack Overflow用户

发布于 2016-07-26 23:42:17

如果有疑问,我会和Python开发人员做同样的事情。毕竟他们写了PEP-8。

你可以考虑你的线路:

代码语言:javascript
复制
target_class = A if some_condition else B

作为模式的内联形式:

代码语言:javascript
复制
target_class = target_class_factory()

在使用CamelCase的Python库中有一个众所周知的例子,namedtuple

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38433503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档