请考虑以下Python模块摘录:
foo.py:
class Foo:
(...)
bar.py:
import foo
foo = foo.Foo()
变量foo是一个模块对象,用Foo对象覆盖。
我知道我可以为对象使用其他名称,例如:
foobar = foo.Foo()
但从语义上来说,在我的代码中更有意义的是将它命名为foo,因为它将是唯一的实例。
(我尝试通过删除类和仅使用模块来解决此问题,但我回到使用类,因为使用模块只有“健壮性”问题。)
这是一个哲学问题,但处理这个潜在对象/模块名称冲突的“正确”方法是什么?
答案 0 :(得分:6)
在我看来,您目前正在做的事情没有任何问题,但为了让每个人都能更清楚地阅读代码,我建议您将代码更改为以下内容:
import foo as foo_mod
foo = foo_mod.Foo()
或者:
from foo import Foo
foo = Foo()
这可以防止名称冲突,因此更明显的是模块中的变量foo
不会引用同名的模块。
答案 1 :(得分:0)
如今我也一直喜欢以下样式:
import foo
my_foo = foo.Foo()
我之所以这样,是因为它使模块名称保持不变,并且它们比局部变量更全局和更神圣。
答案 2 :(得分:0)
此模式似乎不会打扰使用Flask + Celery的人,
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
...
很明显,创建此类实例的正确方法是stalk = Celery()
(呵呵)