Столкновение модулей 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() (хе-хе)

Другие вопросы по тегам