【发布时间】:2019-06-02 18:03:06
【问题描述】:
如何通过用户创建的配置文件动态设置参数默认值?
配置文件由声明了参数的函数路径组成。能够导入函数将允许我获取函数名称及其模块路径。
有没有人知道如何根据函数内的行数和包含函数的python文件(包括类内的函数)导入函数?
编辑(根据 cmets 的要求添加了以下用例)
我想在下面的示例中检索将其参数默认为configured_arg() 的函数:
class SomeClass:
def __init__(kwarg=configured_arg()):
...
def some_function(kwarg=configured_arg()):
...
def another_function(kwarg=configured_arg()):
...
def configured_arg():
# NOTE: `inspect.stack` returns the caller as "<module>"
# NOTE: `inspect.stack` returns the `lineno` and file path of the call
caller = get_caller() # Unsure of how to implement
arg_key = get_arg_key() # Unsure of how to implement
return fetch_configured_value(caller, arg_key) # Fetch default arg from global config
在 SO 上发帖之前,我尝试使用 inspect.stack。调用者(例如some_function)没有出现在configurable_arg的堆栈中。但是,inspect.stack 有 lineno 声明了默认参数。这段经历启发了当前的问题。
【问题讨论】:
-
通过编辑将用例添加到问题中。
-
我觉得您的用例要么混淆了问题,要么指出了 xy 问题。行号是如何计算的?为什么正常检查模块内容没有得到你想要的结果?默认参数并不是特别难以检索。
-
(1) 最后添加,
inspect.stack提供lineno以及声明默认参数的文件路径。这受到当前问题的启发。 (2) 检查调用函数返回<module>而不是有问题的函数。 -
这根本不是在描述用例。您是否尝试动态生成参数默认值?如果是这样,基于什么信息?
-
编辑得更具体。参数默认值由用户创建的配置文件动态设置。这可以通过装饰器实现。但是,我也想尝试上述策略。
标签: python python-3.x abstract-syntax-tree inspect