Python:PEP 8类名作为变量

时间:2016-07-18 09:45:48

标签: python pep8

根据PEP 8,编写用于标识类名(而不是实例)的变量的公约是什么?

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

target_class = A if some_condition else B
instance = target_class()

TargetClass = A if some_condition else B
instance = TargetClass()

<小时/> 如样式指南中所述,

  

班级名称

     

类名通常应使用CapWords惯例。

但也

  

方法名称和实例变量:

     

使用函数命名规则:小写,必要时用下划线分隔,以提高可读性。

在我看来,这两个公约发生了冲突,我找不到哪一个。

4 个答案:

答案 0 :(得分:11)

由于在PEP 8中缺乏对此案例的具体描述,人们可以为奖牌的双方构成争论:

一方面是:由于BTargetClass两者都是变量,但是对类进行引用,在这种情况下使用CamelCase(class A: pass class B: pass x = A A = B B = x )。

没有什么能阻止你做

A

现在BA分别指向其他类,所以它们并没有真正固定在班级上。

因此BTargetClass负有持有课程的唯一责任(无论是否有相同的名称或不同的名称),A也是如此。

为了保持不偏不倚,我们也可以用另一种方式争论:Blower_case是特殊的,因为它们是与它们的类一起创建的,而且类是&#39;内部具有相同的名称。到目前为止,它们都是原始的&#34;,任何其他任务都应该被标记为特殊的,因为它们被视为一个变量,因此在def create_new_one(cls): return cls() class A: pass class B: pass print(create_new_one(A)) 中。

事实就是如此,中间的某个地方。有些情况下,我会走一条路,而其他地方则会走另一条路。

示例1:您将一个可能应该实例化的类传递给方法或函数:

cls

在这种情况下,lower_case显然是非常临时的状态,显然是变量;每次通话都会有所不同。所以它应该是class OldAPI: pass class NewAPI: pass class ThirdAPI: pass CurrentAPI = ThirdAPI

示例2:类的别名

CurrentAPI

在这种情况下,CamelCase将被视为另一个的别名,并在整个程序运行期间保持不变。在这里,我更喜欢{{1}}。

答案 1 :(得分:2)

In case of doubt I would do the same as Python developers. They wrote the PEP-8 after all.

You can consider your line:

target_class = A if some_condition else B

as an in-line form of the pattern:

target_class = target_class_factory()

and there is a well-known example for it in the Python library, the namedtuple,它使用CamelCase。

答案 2 :(得分:1)

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

  • 如果变量是临时的,例如在函数内部或在单个实例中用于解决问题时,应该lower_case使用下划线分隔。

  • 如果变量在全局范围内,并且与其他类一起定义为用于在程序主体中创建对象的别名或派生,则应使用CamelCase定义

答案 3 :(得分:0)

我终于在style guide中找到了一些亮点:

  

班级名称

     

[...]

     

在记录接口并主要用作可调用接口的情况下,可以使用函数的命名约定。

可以使用不是一个强有力的陈述,但它涵盖了这种情况,因为该变量旨在用作可调用的。

所以,为了一般目的,我认为

SELECT 
    CONCAT(
        TRIM(
            SUBSTRING_INDEX(
                SUBSTRING_INDEX(
                    SUBSTRING_INDEX(
                         IF(LOCATE('@yahoo', ResidenceAddress1), ResidenceAddress1, ''),
                         '@yahoo', 1)
                , ' ', -1)
            , ',', -1)
        )
        , IF(LOCATE('@yahoo', ResidenceAddress1), '@yahoo', '')
        , SUBSTRING_INDEX(SUBSTRING_INDEX(IF(LOCATE('@yahoo', ResidenceAddress1), ResidenceAddress1, ''), '@yahoo', -1), ',', 1)
    ) AS mail
    ,ResidenceAddress1
FROM mytable

优于

target_class = A if some_condition else B
instance = target_class()