【发布时间】:2020-09-22 18:31:28
【问题描述】:
假设我有一个包含一堆对象的模块,这些对象都不需要第三方库。好吧,几乎没有:一个函数,称为asterix(),需要第三方包。 asterix() 不是模块的重点,但在需要时方便使用。
仅仅为了一个功能就必须要求并导入整个第三方包似乎是一种耻辱。我有哪些选择?将 asterix() 移动到另一个模块/包或 vendoring 看起来很愚蠢。
我发现快速和干净的最佳平衡是简单地在asterix() 内部进行导入,可能需要一些额外的尝试/排除逻辑。它违反了最小意外原则和将导入放在顶部的惯例。但我告诉自己我总是会违反一些东西。
群众智慧对此有何看法?有什么明显的我想念的吗?
def asterix(...):
try:
import something_special
except ModuleNotFoundError as err:
# do something about err (help the user out!)
# The special code...
【问题讨论】:
-
谢谢@wim。是的,PEP8。但对于房间里的成年人来说,这更像是一个问题——当面对这种权衡时,书本之外的技巧是什么?例如,“在每个函数调用时进行导入检查”的缺点可以通过将函数的定义以成功导入为条件来减轻。好的。但伴随着另一套权衡......
-
您的解决方案不错。每次函数调用时的导入检查只是一个快速的
dict查找,在这里是合理的。 -
@wim 绝对在文件顶部导入是 PEP 8 推荐的做法。但在 PEP 8 中也是这样:“但是,知道何时不一致——有时样式指南建议只是” t 适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。不要犹豫,问!”
标签: python