Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用装饰器向“所有”添加名称是一种好的做法吗?_Python_Coding Style - Fatal编程技术网

Python 使用装饰器向“所有”添加名称是一种好的做法吗?

Python 使用装饰器向“所有”添加名称是一种好的做法吗?,python,coding-style,Python,Coding Style,这在Python中是一个很好的实践吗 一般的想法是定义一个接受函数或类的装饰器 并将其名称添加到当前模块的\uuuuuuuuuuuuuuuu中。这不会自动将名称添加到\uuuuuuuuuuuuuuuuuuuu,它只允许您通过使用@public将函数添加到所有函数中。对我来说似乎是个好主意。我认为这个问题有点主观,但我喜欢这个想法。我通常在我的模块中使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,但有时我忘记添加一个新函数,我打

这在Python中是一个很好的实践吗

一般的想法是定义一个接受函数或类的装饰器
并将其名称添加到当前模块的
\uuuuuuuuuuuuuuuu
中。

这不会自动将名称添加到
\uuuuuuuuuuuuuuuuuuuu
,它只允许您通过使用
@public
将函数添加到所有函数中。对我来说似乎是个好主意。

我认为这个问题有点主观,但我喜欢这个想法。我通常在我的模块中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但有时我忘记添加一个新函数,我打算将其作为模块公共接口的一部分。因为我通常按名称而不是通配符导入模块,所以直到团队中的其他人(使用通配符语法导入模块的整个公共接口)开始抱怨,我才注意到错误


注意:问题的标题具有误导性,因为其他人已经注意到了答案中的问题。

是的,这是一个很好的做法。此装饰器允许您在函数或类定义中正确地陈述您的意图,而不是直接在之后。这使您的代码更具可读性

@public 
def foo():
    pass 

@public 
class bar():
    pass

class helper(): # not part of the modules public interface! 
    pass

注意:
helper
模块用户仍可通过
modulename.helper
访问。它不是通过modulename import*

导入的。在Python中,更惯用的方法是通过以下划线开头的名称将私有函数标记为私有函数:

def public(x):
      ...


def _private_helper(y):
    ...

与您的
public
decorator相比,更多的人会熟悉这种风格(该语言也支持这种风格:
\u private\u helper
即使您不使用
\u all\u
),也不会导出。(还有11个字符)修复了标题,正如一些人指出的那样,虽然这似乎是一个好主意,但我发现它混淆了我的IDE(PyCharm 2016.1.4),这基本上违背了目的。如果有足够的IDE支持,我会使用它。让这个装饰程序100%防弹似乎更难:请参阅和那里提到的。交叉引用:我已经(更改了一个名称)在CW对如何编写这样一个装饰器的问题的回答中。这似乎并没有解决装饰器所解决的问题:保持
\uuuuuuu all\uuuuuuu
中的名称是最新的。@EdL这是因为如果你一直对“私人”事物使用下划线,而对公共事物不使用下划线,您不需要在任何时候使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuall@TobiasKienzler不会导出任何导入的模块吗?你可能仍然想阻止它们。@Neig也不是建议的
@public
装饰者,通常的做法是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuintended@TobiasKienzler@neig使用模式
导入模块作为_模块
,因此我将其称为一种相当成熟的实践。我不一定会直接说这是一种好的实践。在模块开头明确定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。使用公共装饰使这变得更加困难。但是,如果使用装饰器,则可以在查看模块成员时判断该成员是否在
\uuuuu all\uuuu
中。因此,两者都有各自的优点和缺点。darkfeline所说的一切加上——它用幼稚的代码标记器打破了IDE上的智能感知/代码完成。
def public(x):
      ...


def _private_helper(y):
    ...