将模块导入特定范围而不使用inspect

时间:2014-02-10 19:52:05

标签: python

我有一些帮助函数,我已经将其推送到我根据需要导入的一些支持库中。我有一些函数必须访问globals(),无论函数调用的是什么范围,以简化一些日志记录和字符串构造。一个这样的函数是format_vars,默认情况下尝试使用globals()dict作为字符串格式方法的直接参数。

def format_vars(s, vars=None):
    """Use .format() on a string while providing a dictionary or globals() by default.

       Big Fat Warning: globals() is global to module, not script"""

    if not vars:
        vars = globals()

    return s.format(**vars)

这非常有用,为了利用它我不幸地必须从函数创建源代码然后执行它。我在函数定义下面的模块代码中有以下内容。

FORMAT_VARS_SOURCE = inspect.getsource(format_vars)

在想要使用此功能的脚本中,我必须包含该模块,然后执行以下操作:

exec(supportlib.FORMAT_VARS_SOURCE)

我的问题是,是否有更合适的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您总是希望帮助程序引用直接调用范围,您应该能够使用帮助程序中的inspect.stack()[-1][0].f_globals从调用范围获取全局变量,我相信。我知道你的标题是“没有检查”,但从问题的文本来看,它看起来真的是“没有引入范围内的时髦代码”。