更多的夸尔格!让调用参数覆盖kwargs
mo-kwargs的Python项目详细描述
更多的夸尔格!
Branch | Status |
---|---|
master | |
dev |
动机
广泛使用依赖注入,再加上管理每个被注入组件的配置,可能会导致一些非常复杂的系统配置。减少复杂性的一种方法是使用包含有用的默认值的配置模板,然后覆盖需要为所需配置更改的属性。
@override
被创建来为python函数调用提供这个模板系统。它主要用于类构造函数,但是任何方法都可以受益。装饰器添加了一个kwargs
参数,可以给它一个默认参数的模板;但是与**kwargs
不同的是,它不会引发重复的键异常。
提供默认值
我们用@override
装饰login()
函数。在这种情况下,username
是必需的参数,并且password
将默认为None
。
@override
def login(username, password=None):
pass
定义一些dicts
用于我们的kwargs
参数:
creds = {"userame": "ekyle", "password": "password123"}
alt_creds = {"username": "klahnakoski"}
最简单的情况是当我们使用kwargs
时没有覆盖
login(kwargs=creds)
# SAME AS
login(**creds)
# SAME AS
login(username="ekyle", password="password123")
您可以重写kwargs
中的任何属性:在本例中,它是password
login(password="123", kwargs=creds)
# SAME AS
login(username="ekyle", password="123")
重写kwargs
:
login(username="klahnakoski", password="asd213", kwargs=creds)
# SAME AS
login(username="klahnakoski", password="asd213")
您可以继续使用**kwargs
;这提供了一种将一个参数模板(creds
)与另一个参数模板(alt_creds
)重叠的方法
login(kwargs=creds, **alt_creds)
# SAME AS
login(username="klahnakoski", password="password123")
处理太多参数
有时,方法参数来自配置文件,或其他不受您控制的外部源。你的方法可能无法接受更多的参数。
creds = {"username": "ekyle", "password": "password123", "port":9000}
def login(username, password=None):
print(kwargs.get("port"))
如果没有mo-kwargs
,直接将creds
字典传递给login()
会产生一个键错误
>>> login(**creds)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: login() got an unexpected keyword argument 'port'
传统的解决方案是显式地传递参数:
login(username=creds.username, password=creds.password)
但如果经常这样做,或者参数列表太长,就会变得很乏味。mo-kwargs
允许您将整个字典传递给kwargs
参数;只使用方法使用的参数:
@override
def login(username, password=None):
pass
login(kwargs=creds)
# SAME AS
login(**creds)
打包所有参数
您的方法可以接受kwargs
作为参数。如果是,请确保它默认为None
,这样就不需要它了。
@override
def login(username, password=None, kwargs=None):
print(kwargs.get("username"))
print(kwargs.get("port"))
kwargs
将始终是一个dict,可能是空的,具有完整的参数集。这与使用**kwargs
不同,后者只包含关键字参数的其余部分。
>>> creds = {"username": "ekyle", "password": "password123", "port":9000}
>>> login(**creds)
ekyle
9000