Python模块和对象名称冲突

时间:2013-04-03 23:05:46

标签: python naming-conventions name-clash

请考虑以下Python模块摘录:

foo.py:

class Foo:
  (...)

bar.py:

import foo

foo = foo.Foo()

变量foo是一个模块对象,用Foo对象覆盖。

我知道我可以为对象使用其他名称,例如:

foobar = foo.Foo()

但从语义上来说,在我的代码中更有意义的是将它命名为foo,因为它将是唯一的实例。

(我尝试通过删除类和仅使用模块来解决此问题,但我回到使用类,因为使用模块只有“健壮性”问题。)

这是一个哲学问题,但处理这个潜在对象/模块名称冲突的“正确”方法是什么?

3 个答案:

答案 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()(呵呵)