Столкновение модулей Python и имен объектов
Пожалуйста, рассмотрите следующие выдержки из модулей Python:
foo.py:
class Foo:
(...)
bar.py:
import foo
foo = foo.Foo()
Переменная foo, которая была объектом модуля, перезаписывается объектом Foo.
Я знаю, что могу использовать другие имена для объекта, например:
foobar = foo.Foo()
но семантически в моем коде больше смысла называть его foo, так как это будет единственный экземпляр.
(Я попытался обойти это, отбросив классы и используя только модули, но я вернулся к использованию классов, потому что при использовании модулей возникали только проблемы "надежности".)
Это своего рода философский вопрос, но каков "правильный" способ обработки этого потенциального столкновения имен объектов / модулей?
1 ответ
На мой взгляд, нет ничего плохого в том, что вы в данный момент делаете, но чтобы было понятнее всем, кто читает код, я бы предложил изменить ваш код на что-то вроде следующего:
import foo as foo_mod
foo = foo_mod.Foo()
Или в качестве альтернативы:
from foo import Foo
foo = Foo()
Это предотвращает конфликт имен, поэтому будет более очевидно, что переменная foo
в вашем модуле не собирается ссылаться на модуль с тем же именем.
Еще я сейчас отдаю предпочтение следующему стилю:
import foo
my_foo = foo.Foo()
Я предпочитаю это, потому что он сохраняет имена модулей нетронутыми, а они более глобальны и священны, чем локальные переменные.
Этот шаблон, похоже, не беспокоит тех, кто использует 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()
(хе-хе)