命名Python模块为"global"或其他关键字是否有害?

4
我继承了一些旧的Django代码,其中一个模块被命名为“global”(在“INSTALLED_APPS”中的完整名称为“labweb.global”),它持有驱动主页和一些其他散点站点的模型和视图。然而,“global”是Python关键字,所以这很奇怪...但它确实能工作。
我99%确定将模块命名为关键字是个坏主意,但我很惊讶它竟然能工作。 Django怎么不在意呢?

我只是好奇,你是怎么导入的?是用 from labweb.global import * 吗?我认为你说得对,在Python中,global绝对不是一个好的模块名。它会强制你做一些尴尬的事情来避免与关键字冲突。 - Shashank
我并没有直接导入该模块,而是在 settings.py 中将其作为字符串添加到 INSTALLED_APPS 列表中后,Django 会自动(神奇地)导入它。其他对该模块的引用也都是通过字符串进行的(如 URL 名称等)。 - Nick T
@ShashankGupta,不,带点名称中的任何关键字仍然会导致SyntaxError。您无法直接导入此类模块。但是,在标准库中有一些导入工具可以通过将其名称作为字符串传递来导入模块。 - Tim Peters
我猜它能工作是因为Django可能在动态加载模块。一个简单的“import global”会导致语法错误。这不会影响通常关键字的使用,因为它被存储为字典,你可以在那里使用任何字符串。 - swstephe
1个回答

3
当然不行,直接导入这样的模块是个坏主意。
import global # or any other keyword

只是在编译时会引发 SyntaxError。但或许这正是设计者的本意?也就是说,设计者希望确保模块不能直接被导入(只能通过诡计导入)。我不知道——我只是想慷慨一些 ;-)

示例

这可能是导入此类模块最简单的方法。这里有一个名为 global.py 的文件:

print "I'm global!"

接下来:

>>> import importlib
>>> importlib.import_module("global")
I'm global!
<module 'global' from 'global.py'>

还有其他的方法可以实现这个,但是直接导入是不可能的


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