Python Readline REPL控制台与Gettext下划线变量冲突问题求助
解决gettext与调试控制台
_变量冲突的方案 方案1:修改gettext挂载变量,或采用本地化最佳实践
方法1:指定gettext挂载到自定义全局变量
gettext.translation().install()支持通过global_alias参数替换默认的_变量:
import gettext import os # 将翻译函数挂载到`_t`而非默认的`_` trans = gettext.translation( 'projectname', localedir=os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))+'/locales', languages=[locale] ) trans.install(global_alias='_t')
后续翻译文本直接调用_t('待翻译内容')即可,完全避开控制台的_变量冲突。
方法2:模块级/实例级翻译(推荐最佳实践)
避免全局挂载翻译函数,改为在模块或类内维护翻译对象,更清晰且无全局污染:
# 在核心模块中初始化翻译对象 import gettext import os def get_translator(): return gettext.translation( 'projectname', localedir=os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))+'/locales', languages=[locale] ) trans = get_translator() _ = trans.gettext # 仅在当前模块内使用`_`,不挂载到全局
其他模块需要翻译时,直接导入该_:
from your_core_module import _ print(_('Hello World'))
方案2:禁用调试控制台的_变量赋值
code.InteractiveConsole的runcode方法会自动将最后一条命令的输出赋值给_,我们可以继承并重写该方法移除这个逻辑:
import code import sys class NoUnderscoreConsole(code.InteractiveConsole): def runcode(self, code): try: # 执行代码但不保存输出到`_`变量 exec(code, self.locals) except SystemExit: raise except: self.showtraceback() # 移除原逻辑中`self.locals['_'] = sys.last_value`这一行 # 初始化自定义控制台 env = globals().copy() env['self'] = self shell = NoUnderscoreConsole(env) shell.interact()
修改后调试控制台不会再覆盖_变量,gettext翻译功能可正常使用。
内容的提问来源于stack exchange,提问作者Signum Ignitum
相关产品推荐
相关产品推荐

