如何让用户创建的配置文件动态设置参数默认值?
配置文件由函数路径及其声明的参数组成。能够导入该函数将使我能够获取函数名称及其模块路径。
给定函数内部的行号和包含该函数的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。这种经历启发了当前的问题。
答案 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
。