【发布时间】:2018-12-07 18:28:42
【问题描述】:
我是一个包的小贡献者,人们应该这样做(Foo.Bar.Bar 是一个类):
>>> from Foo.Bar import Bar
>>> s = Bar('a')
有时人们会错误地这样做(Foo.Bar 是一个模块):
>>> from Foo import Bar
>>> s = Bar('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
这可能看起来很简单,但用户仍然无法调试它,我想让它更容易。我无法更改 Foo 或 Bar 的名称,但我想添加一个信息更丰富的回溯,例如:
TypeError("'module' object is not callable, perhaps you meant to call 'Bar.Bar()'")
我阅读了Callable modules 问答,我知道我不能将__call__ 方法添加到模块中(而且我不想仅仅为此将整个模块包装在一个类中)。无论如何,我不希望模块是可调用的,我只想要一个自定义回溯。是否有适用于 Python 3.x 和 2.7+ 的干净解决方案?
【问题讨论】:
-
我知道您说过您不能重命名模块,但这确实是最佳解决方案。将
Foo重命名为foo并将Bar(模块)重命名为bar将在很大程度上表明它们不是类,并且人们不太可能将bar与Bar混淆。 -
@Aran-Fey 是的,但这里的遗产很重要,如果我更改名称,很多代码会中断,我很确定这是不允许的
-
您可以重命名它并在一段时间内提供一个已弃用的向后兼容解决方案。这样你就可以修复你的教程并让新咖啡更明显,而不会在没有警告的情况下破坏旧代码。尽管没有可调用的方法,但不知道在这里更改消息。
-
虽然我知道这不是你想要的,也可能没有帮助,但我支持@Aran-Fey 和@Voo。
Foo和Bar的命名带来了混淆,它们应该在 PEP8 之后的snake_case中。尝试调用小写名称来实例化对象会立即让您觉得有点奇怪,至少对于 Python 的非初学者而言。
标签: python python-3.x python-2.7 exception module