描述符的命名规范

11

我有一个描述符

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

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

我将它用作装饰器:

class MyClass():

    @ReferredItem
    some_method(self):
        ...

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

我应该像 referred_item 这样命名类吗?还是保留现在的命名方式不变?


1
最好将您的装饰器编写为闭包,这样也会使这个问题变得过时...(值得一提的是,在任何情况下我都会使用 referred_item。) - Sven Marnach
2
我同意,我认为更多的是关于你用它的方式,所以我会选择“referred_item” - 标准库中有这方面的先例 - “itertools.chain”是一个类(具有函数“from_iterable()”),但它被用作函数,因此小写。 - Gareth Latty
1
@Lattyware:有很多例子:propertyabc.abstractproperty,几乎所有的 itertools 中的内容,以及内置类型(intfloatdict,...)。 - Ferdinand Beyer
@FerdinandBeyer 确实,我只是举了我想到的第一个例子。 - Gareth Latty
1
如果您使用的是Python 2,请使用(object)代替();如果您使用的是Python 3,则省略() - Chris Morgan
4个回答

14

PEP8规定:

几乎没有例外,类名使用CapWords约定。

在标准库中,通常用作函数的类通常遵循函数命名约定,而不解释有哪些例外情况。例如,itertools.groupby实际上是一个类,但在普通使用中您不会注意到它是这样的; 它是一个实现细节,groupby可以被重写为一个实际的函数。

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


5

虽然任何可调用对象都可以用作装饰器,但它们通常被认为是函数,并且函数类似的对象应遵循“小写加下划线”的惯例。

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

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

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

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

referred_item = _ReferredItem

请在标准库中为我找一个使用snake_case而不是lowercasewithspacesremoved的装饰器。我想不出任何一个。 - Chris Morgan
@ChrisMorgan:举个例子:functools.total_ordering - Ferdinand Beyer
例子被接受了。我想我会让那个格式继续存在。(我知道很多标准库使用去除空格的小写形式表示事物,如果它们在外部,它们本应该使用下划线,甚至包括 int 而不是 Int。) - Chris Morgan

2
我通常使用驼峰命名法来命名类,然后添加一个别名作为装饰器。
referred_item = ReferredItem

你会使用驼峰命名法来命名它吗?如果不会的话,我不明白为什么你要让它存在。 - Chris Morgan
有时我会这样做,例如在isinstance调用中。此外,该名称在repr中使用。 - yak

1

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

因此,我更喜欢看到referred_item而不是ReferredItem


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接