Хорошая практика для глобальной переменной/функции

#python #python-import #gettext

Вопрос:

Я сталкиваюсь с проблемой, что только части моего проекта переведены/локализованы должным образом.

Проблема в том, что gettext функция _ определяется по-разному в двух модулях. print_text1() переводится и print_text2() не переводится.

Решение, похоже, имеет какую-то глобальную переменную или флаг для языка. Как будет выглядеть решение, которое считается хорошей практикой?

Модуль A.py

 import gettext
from B import *

language='de'

if language is 'de':
    de = gettext.translation('base', localedir='locales', languages=['de'])
    de.install()
    _ = de.gettext
else:
    _ = gettext.gettext

def print_text1():
    print(_("Power consumption"))

print_text1()
print_text2()
 

Модуль B.py

 import gettext

_ = gettext.gettext

def print_text2():
    print(_("Warm Water"))
 

Комментарии:

1. language is 'de' это хлопотно. Сравните равенство, а не идентичность, т. е. language == 'de'

2. Проще всего использовать gettext.install в главном модуле. Это добавляет _ пространство имен builtins, что означает, что вам вообще не нужно ничего импортировать в другие модули. Однако обратите внимание, что это означает, что модули больше нельзя использовать по отдельности без основного модуля, поэтому он не подходит для модульности.

3. В качестве альтернативы вы можете создать _ объект так же, как вы делаете это сейчас, но в отдельном модуле, а затем импортировать его везде, где он вам нужен.