这是一个关于这些方法中哪一种被认为是最有效的问题。Pythonic。我不是在寻找个人意见,而是在寻找惯用的观点。我的背景不是Python,所以这会对我有帮助。
我正在开发一个可扩展的 Python 3 项目。这个想法类似于工厂模式,只不过它是基于函数的。
本质上,用户将能够创建一个自定义函数(跨包和项目),我的工具可以找到并动态调用该函数。它还能够使用柯里化来向下传递参数(但此处不包含该代码)
我的目标是遵循良好的 Python 实践。我在两种策略之间左右为难。而且,由于 Python 不是我的专业知识,我想知道以下做法的优缺点:
-
使用装饰器
registered = {}
def factoried(name):
def __inner_factory_function(fn):
registered[name] = fn
return fn
return __inner_factory_function
def get_function(name):
return registered[name]
然后,自动注册以下函数...
@factoried('foo')
def build_foo():
print('hi')
这看起来很合理,但对于那些不熟悉装饰器的人来说确实显得有点神奇。
-
强制抽象类的子类化并使用__subclasses__()
如果使用子类,则无需注册。然而,我觉得这会迫使在不需要完整的类时定义类。另外,使用.__subclasses__()
对于消费者来说,幕后的一切似乎也很神奇。然而,即使是Java也可以用来搜索带有注释的类。
-
显式注册
忘记以上所有内容并强制显式注册。没有装饰器。没有子类。就像这样:
def build_foo():
# ...
factory.register('foo', build_foo)
这个问题没有答案。
Python 基金会提倡的唯一标准实践是PEP 8 https://www.python.org/dev/peps/pep-0008/.
PEP 8 与此类更高级别的“设计模式”问题几乎没有关系,特别是与您的具体问题没有任何关系。
而且,即使确实如此,PEP 8 也明确只是一个指导方针“包含主要 Python 发行版中标准库的代码” https://www.python.org/dev/peps/pep-0008/?#introduction,Guido 拒绝了将其成为某种应该在每个 Python 项目上强制执行的广泛标准的建议。
另外,它强调了这一点:这只是一个指导方针,而不是严格的建议 https://www.python.org/dev/peps/pep-0008/?#a-foolish-consistency-is-the-hobgoblin-of-little-minds.
当然,人们更喜欢一种设计而不是另一种设计是有主观原因的。
理想情况下,这些主观原因通常是由一些社区对“惯用”或“Pythonic”的共识所驱动的。但社区共识并没有作为您可以引用的客观来源记录在任何地方。
可能有一些论点吸引Python 之禅 https://www.python.org/dev/peps/pep-0020/,但这本身只是蒂姆·彼得斯(Tim Peters)试图将吉多自己的主观指导原则提炼成一系列精辟的原话集锦,而不是客观来源。 (任何人只要简单浏览一下,例如python-ideas
列表可以看到几乎任何问题的双方都可以诉诸禅宗……)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)