把变量写入builtins命名空间,不用在每个文件中import

有些全局函数,几乎在项目的每个源文件中都要调用,如果都要import,不仅麻烦,而且容易出错。这种情况可以把全局函数写入到builtins命名空间,因为builtins空间中的对象都会自动引入,就能省去每个文件中的import。

例如我最近采用gettext对一个开源项目进行汉化,需要把原来源代码中的字符串变成_('....'),_()是gettext.translation.gettext的简写。在gettext的官方文档中建议:

If you are localizing your application, you can install the _() function globally into the built-in namespace, usually in the main driver file of your application. This will let all your application-specific files just use _('...') without having to explicitly install it in each file.

意思是如果对整个application进行国际化,可以把_()函数安装到built-in命名空间,这样就不用在每个文件中显式导入。但原文没有提供方法,经过在Stack Overflow上的反复搜索,终于找到了一个简单的办法。最终的测试代码如下:

# -*- coding:utf-8 -*-
import gettext
import builtins

def sayHello():
    print(_("Hello world!"))
    print(_("Python is an good language"))

if __name__=="__main__":
    gettext.install('messages', localedir='./locale')
    translator = gettext.translation('messages', localedir='./locale', languages=['zh_CN'])
    builtins._ = translator.gettext
    sayHello()

其中builtins._ = translator.gettext就是把_()函数引入到builtins命名空间,从而可自动导入。


版权声明:本文为liujinz72213原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。