【问题标题】:How to dynamically provide function argument defaults from config files?如何从配置文件动态提供函数参数默认值?
【发布时间】: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.stacklineno 声明了默认参数。这段经历启发了当前的问题。

【问题讨论】:

  • 通过编辑将用例添加到问题中。
  • 我觉得您的用例要么混淆了问题,要么指出了 xy 问题。行号是如何计算的?为什么正常检查模块内容没有得到你想要的结果?默认参数并不是特别难以检索。
  • (1) 最后添加,inspect.stack 提供lineno 以及声明默认参数的文件路径。这受到当前问题的启发。 (2) 检查调用函数返回&lt;module&gt; 而不是有问题的函数。
  • 这根本不是在描述用例。您是否尝试动态生成参数默认值?如果是这样,基于什么信息?
  • 编辑得更具体。参数默认值由用户创建的配置文件动态设置。这可以通过装饰器实现。但是,我也想尝试上述策略。

标签: python python-3.x abstract-syntax-tree inspect


【解决方案1】:

在调用函数configured_args 时,尚未定义为其设置默认参数的函数。

您需要在函数定义之后更改默认参数。一种方法是使用装饰器。

然后,您可以使用函数的以下属性在模块中查找其位置。

  • __module__:定义函数的模块名称;
  • __name__:函数名;
  • __qualname__:模块中函数的完整路径。例如,在类 A 中定义的函数 f 会将 __qualname__ 设置为 A.f

代码

from functools import wraps

def get_kwargs(qualname, module):
    # Get the default kwargs from configs
    return {'kwarg': ...}

def configure_args(f):
    qualname = f.__qualname__
    module = f.__module__

    default_kwargs = get_kwargs(qualname, module)

    @wraps(f)
    def wrapper(*args, **kwargs):
        new_kwargs = {**default_kwargs , **kwargs}
        return f(*args, **new_kwargs)

    return wrapper

@configure_args
def my_func(*args, **kwargs):
    ...

函数my_func 现在有一个默认关键字参数kwarg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多