哪种方式最适合Python工厂注册?

2024-06-19

这是一个关于这些方法中哪一种被认为是最有效的问题。Pythonic。我不是在寻找个人意见,而是在寻找惯用的观点。我的背景不是Python,所以这会对我有帮助。

我正在开发一个可扩展的 Python 3 项目。这个想法类似于工厂模式,只不过它是基于函数的。

本质上,用户将能够创建一个自定义函数(跨包和项目),我的工具可以找到并动态调用该函数。它还能够使用柯里化来向下传递参数(但此处不包含该代码)

我的目标是遵循良好的 Python 实践。我在两种策略之间左右为难。而且,由于 Python 不是我的专业知识,我想知道以下做法的优缺点:

  1. 使用装饰器

    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')
    

    这看起来很合理,但对于那些不熟悉装饰器的人来说确实显得有点神奇。

  2. 强制抽象类的子类化并使用__subclasses__()

    如果使用子类,则无需注册。然而,我觉得这会迫使在不需要完整的类时定义类。另外,使用.__subclasses__()对于消费者来说,幕后的一切似乎也很神奇。然而,即使是Java也可以用来搜索带有注释的类。

  3. 显式注册

    忘记以上所有内容并强制显式注册。没有装饰器。没有子类。就像这样:

    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(使用前将#替换为@)

哪种方式最适合Python工厂注册? 的相关文章

  • 整数 numpy 数组乘以浮点数

    我有一个包含整数值的 numpy 数组 如果我将整个矩阵乘以一个浮点数 结果是一个浮点矩阵 但如果我通过 for 循环逐列相乘 它只给出整数部分 import numpy as np A np array 1 2 3 4 5 6 7 8 9
  • 根据 cron 规范计算下一个计划时间

    在给定当前时间和 cron 规范的情况下 计算事件下一次运行时间的有效方法是什么 我正在寻找 每分钟循环检查是否符合规范 以外的东西 规格示例可能是 每月1日 15日15 01 每小时整点的 10 20 30 40 50 分钟 Python
  • 导入父目录进行简单测试

    我从上到下搜索了这个网站 但还没有找到一种方法来真正实现我在 Python3x 中想要的东西 这是一个简单的玩具应用程序 所以我想我可以在断言中编写一些简单的测试用例 然后就到此为止了 它确实会生成报告等 因此我想确保我的代码在更改时不会做
  • Python Turtle 未按照文档示例填充

    我试图向我女儿展示一些代码 并认为海龟会很有趣 我更喜欢数字 但这对孩子们来说并不有趣 我在重现文档示例时遇到问题 这更让我烦恼 因为我无法弄清楚 我们还有很多其他事情可以做 The documentation example copied
  • 我可以在 Mac OS X 上将 enthought python 重新链接到新版本的 openssl 吗?

    今天早上 我在 Mac OS X 10 6 8 上使用 EPD 7 3 时遇到了与 SSL 相关的问题 当我运行 pip 版本 1 3 1 时 我得到 pip install requests Downloading unpacking r
  • dulwich - 从远程仓库身份验证克隆

    我找不到有关此主题的任何资源 我需要通过提供用户名和密码从私有存储库进行克隆 然而 当它们作为关键字参数提供给 dulwich get client from path 时 会出现错误 提示 未知参数 用户名 这似乎是一件简单的事情 但我找
  • 当我执行 pip --version 时,它显示错误为 ImportError:没有名为 pyparsing 的模块

    我尝试安装 卸载py解析以及它不起作用 我被这个问题困住了 我还必须安装额外的库 这是错误消息 Traceback most recent call last File usr bin pip line 5 in
  • 从 Python 执行 PowerShell 脚本的最佳方式是什么

    之前关于该主题的所有帖子都涉及其用例的具体挑战 我认为 如果有一篇文章只讨论从 Python 运行 PowerShell 脚本的最简洁方法 并询问是否有人有比我发现的更好的解决方案 那将会很有用 绕过 PowerShell 尝试以与预期不同
  • TensorFlow 的 Print 或 K.print_tensor 不会在损失函数中打印中间张量

    我为 Keras 模型编写了一个相当复杂的损失函数 并且它不断返回nan训练时 因此 我需要在训练时打印中间张量 我知道你不能在损失函数中执行 K eval 因为张量未初始化 不过 我都尝试过K print tensor and tf Pr
  • matplotlib x 轴时间重叠

    我用以下函数及时绘制比特率 usr bin python3 import matplotlib pyplot as plt import datetime def plotBitrate time bitrate filename time
  • 如何在不重复代码的情况下定义 randint 元组?

    我经常使用 randint 元组来表示颜色值等 a b c randint 0 255 randint 0 255 randint 0 255 当我认为必须有更好的方法时 有吗 使用numpy 1 import numpy as np tu
  • python 中是否可以有受保护的类变量或方法? [复制]

    这个问题在这里已经有答案了 python 中是否可以有受保护的类变量或方法 我可以看一下这种用法的示例吗 最简洁的答案是不 有一些约定和良好的风格允许您指示某人不应修改这些变量或从类外部调用这些方法 但没有办法严格执行这一点 Python
  • Pythonlibs3 CMake 和 macOS

    更新2 将以下两行添加到我的 CMake 文件中时 成功找到了 python 3 及其库 这只在终端中工作的原因是因为 CLion 使用其捆绑版本的 CMake 3 6 3 而我的终端使用的更新版本 3 7 2 正确找到了 python F
  • Python 子进程在发出 HTTP 请求时无提示崩溃

    我在组合多处理 请求 或 urllib2 和 nltk 时遇到问题 这是一个非常简单的代码 gt gt gt from multiprocessing import Process gt gt gt import requests gt g
  • Python:装饰器可以确定函数是否在类中定义吗?

    我正在编写一个装饰器 出于各种烦人的原因 0 检查它所包装的函数是独立定义还是作为类的一部分定义 以及新类是哪些类的子类 是很方便的 例如 def my decorator f defined in class print r s f de
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库
  • 导入错误:无法导入名称 DependencyWarning

    我正在使用 python 2 7 12 当我做import requests 我看到下面的错误 尝试卸载和安装 requests 也升级 pip 但没有运气 仍然是同样的问题 Python 2 7 12 default Nov 19 201
  • Pylance 无法在 VSCode Jupyter 笔记本中工作

    皮兰斯工作于 py files 但不适用于 Jupyter ipynb笔记本 我尝试保存 ipynb 同样的问题 如何在我的笔记本中启用 Pylance 警告 Jupyter 扩展似乎不支持 Pylance 我提交这个问题就是为了解决这个缺
  • 编写适用于 ndarray 和 MaskedArray 的通用数值函数的最佳实践

    有没有比以下更漂亮的方式 import numpy as np from numpy import ma def foo x pkg ma if isinstance x ma MaskedArray else np return pkg
  • Django 类视图未返回 HttpResponse 对象。它返回 None 相反

    urls py from housepost views import ListingPost url r house post ListingPost as view name post house views py from djang

随机推荐