如何从配置文件动态提供函数参数默认值?

时间:2019-01-08 04:13:00

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

如何让用户创建的配置文件动态设置参数默认值?

配置文件由函数路径及其声明的参数组成。能够导入该函数将使我能够获取函数名称及其模块路径。

给定函数内部的行号和包含该函数的python文件(包括类内部的函数),有人知道如何导入函数吗?


编辑(根据评论的要求添加了以下用例)

在以下示例中,我想检索将其参数默认为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的{​​{1}}已声明了默认arg。这种经历启发了当前的问题。

1 个答案:

答案 0 :(得分:0)

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

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

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

  • __module__:定义函数的模块的名称;
  • __name__:函数的名称;
  • __qualname__:模块中函数的完整路径。例如,在类f中定义的函数A__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