【问题标题】:Naming convention for descriptors描述符的命名约定
【发布时间】:2012-04-18 15:20:21
【问题描述】:

我有一个描述符

class ReferredItem(): 
    def __init__(self, method):
        self.method = method

    def __get__(self, obj, objtype):
        ...

我用它作为装饰器:

class MyClass():

    @ReferredItem
    some_method(self):
        ...

我看到装饰器是小写的。但是类应该以驼峰命名。

我应该将类命名为referred_item 吗?还是保持现状?

【问题讨论】:

  • 将装饰器编写为闭包很可能更容易。这也会使这个问题过时......(无论如何,我都会使用referred_item。)
  • 我同意,我认为这更多的是关于您使用它的用途,所以我会选择 referred_item - 在标准库中有这样的先例 - itertools.chain 是一个类(与函数from_iterable()),但它被用作函数,所以是小写的。
  • @Lattyware:有很多例子:propertyabc.abstractproperty,关于itertools中的所有内容,...,以及内置类型(int,@987654332 @, dict, ...)。
  • @FerdinandBeyer 确实,我只是举了第一个想到的例子。
  • 如果您使用的是 Python 2,请使用 (object) 而不是 ();如果您使用的是 Python 3,请省略 ()

标签: python coding-style naming-conventions


【解决方案1】:

PEP8 声明

几乎无一例外,类名都使用 CapWords 约定。

没有解释异常是什么,但在标准库中,最常用作函数的类通常遵循函数命名约定。例如。 itertools.groupby 实际上是一个类,但在普通使用中你不会注意到;这是一个实现细节,groupby 可以重写为实际函数。

您可以通过对用作装饰器的类使用全小写的装饰器命名约定来采用类似的样式:referred_item,而不是 ReferredItem

【讨论】:

    【解决方案2】:

    尽管任何可调用对象都可以用作装饰器,但它们通常被认为是函数,类函数对象应遵循“lowercase_with_underscores”约定。

    你应该隐藏你的装饰器是一个类的事实,因为这是一个实现细节。因此,装饰器应该遵循“lowercase_with_underscores”风格。这样,如果有一天您决定将装饰器实现为函数,您就不必更改用户代码。

    就我个人而言,我仍然会使用 CapWords 作为(内部)装饰器类名,并提供一个别名变量,该变量应该用于装饰器:

    class _ReferredItem:
        def __init__(self, method):
            self.method = method
    
        def __get__(self, obj, objtype):
            # ...
    
    referred_item = _ReferredItem
    

    【讨论】:

    • 在标准库中给我找一个装饰器,它使用snake_case而不是去掉空格的小写。我想不出来。
    • @ChrisMorgan:举个例子:functools.total_ordering
    • 接受示例。我想我会让那个表格活着,那么。 (我知道很多标准库如何使用带空格的小写形式来表示如果它们在外面,会在其中包含下划线的东西,甚至是int而不是Int。)
    【解决方案3】:

    PEP8 在这一点上并不是特别清楚……但非正式地,我发现一个好的规则是:如果一个类将像函数一样使用(例如,作为装饰器,也像上下文管理器之类的东西),它应该有一个像函数一样的小写名称。这似乎是标准库遵循的约定。

    所以我更愿意看到referred_item 而不是ReferredItem

    【讨论】:

      【解决方案4】:

      我通常使用 CamelCase 作为类,然后添加我用作装饰器的别名。

      referred_item = ReferredItem
      

      【讨论】:

      • 你会使用 CamelCase 名称吗?如果不是,我不明白你为什么要让它存在。
      • 有时我会。例如在 isinstance 调用中。此外,该名称用于 repr。
      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      相关资源
      最近更新 更多