问题
ol' 模块 switcheroo是否有任何有效的用例,您将模块替换为类实例?我所说的有效用例是指普遍认为使用此技巧是解决问题的最佳方法的情况。例如,模块:
VERSION = (1, 2, 8)
VERSION_NAME = '1.2.8'
可以转换成这样:
import sys
class ConstantsModule(object):
def __init__(self):
self.VERSION = (1, 2, 8)
@property
def VERSION_NAME(self):
return u'{}.{}.{}'.format(*self.VERSION)
sys.modules[__name__] = ConstantsModule()
现在VERSION_NAME
是一个有逻辑的属性。
我已经用谷歌搜索了这个,但没有找到任何相关的东西。我在一段时间前阅读的 SO 答案中了解到了这个技巧,我知道这被称为“黑魔法”并且应该避免,但我对有效的用例很好奇。
我的具体用例
我的一个模块有一个小问题,如果该模块是类实例,则可以轻松解决。我有一个名为 的“常量” VERSION_NAME
,它是 的字符串版本VERSION
,它又是一个包含我的应用程序版本信息的元组。在我的VERSION_NAME
整个项目和基于这个的其他几个项目中都使用了它。现在我想VERSION_NAME
包含一些逻辑 - 我希望它基于VERSION
这样我不必一直手动编辑它,并且我希望它的格式根据几个环境情况略有不同。在我看来,我有两个选择:
VERSION_NAME
查找我的项目及其所有子项目中的每个用例,并将其更改为函数调用,例如get_version_name
.- 如上所示调用黑魔法。
这个问题与我的用例无关,这只是我认为它可以用于什么的一个例子。