Python中Readline REPL控制台与Gettext(下划线变量)发生冲突。

3
我正在使用gettext进行本地化,并将gettext()函数安装到全局变量_中。然而,我用于调试目的的readline控制台也使用_作为特殊变量,用于引用上一条命令的输出。因此,每次在控制台中键入任何内容时,它都会覆盖_变量并且我的所有本地化都失效了。

所以,我希望能够实现以下两种方式之一:

  1. gettext()安装到另一个变量中,或者其他本地化Python包的最佳实践方法。
  2. 停止Readline将上一次的输出分配给_变量。

以下是类中各个点的情况:

#Install gettext() to global scope
import gettext
gettext.translation('projectname', localedir=os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))+'/locales', languages=[locale]).install()

#Debug console
import code, readline
env = globals().copy()
env['self'] = self
shell = code.InteractiveConsole(env)
shell.interact()

我尝试从env字典中删除和覆盖下划线_(即env['_'] = None),但不幸的是,Readline似乎无论如何都会在全局范围内设置_

1个回答

0

关于gettext.install的文档提到需要阅读有关它安装的names的另一部分

[...] Note that this is only one way, albeit the most convenient way, to make the _() function available to your application. Because it affects the entire application globally, and specifically the built-in namespace, localized modules should never install _(). Instead, they should use this code to make _() available to their module:

import gettext
t = gettext.translation('mymodule', ...)
_ = t.gettext

这能解决你的问题吗?


1
好吧,这又引发了另一个问题。如果我可以在帮助模块中定义_一次,并在每个文件的顶部执行from mymodule.helpers import *,那么我会很满意,但显然import *会跳过_函数,我想避免在每个文件的顶部放置这三行代码。现在我通过将函数命名为ï而不是_来实现这一点,这样做虽然可行,但似乎并不理想。 - Signum Ignitum
1
你只能定义一次。将这三行代码放在它们自己的文件中,然后从中导入“t”(也许使用另一个更清晰的名称,如PyQt使用的“tr”)。 - Lenormju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接