更多的夸尔格!让调用参数覆盖kwargs

mo-kwargs的Python项目详细描述


更多的夸尔格!

BranchStatus
masterBuild Status
devBuild StatusCoverage Status

动机

广泛使用依赖注入,再加上管理每个被注入组件的配置,可能会导致一些非常复杂的系统配置。减少复杂性的一种方法是使用包含有用的默认值的配置模板,然后覆盖需要为所需配置更改的属性。

@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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java开始为Android开发应用程序   在哪种情况下,c++/c#namespace方法比Java方法更好?   java重构帮助。。。基于属性的对象还是大量成员字段?   java如何使用jackon json将嵌套对象作为字符串的对象转换为Pojo?   java是流式传输远程日志文件的有效方法   javajackson数据绑定:读入现有对象   java NullPointerException这是如何发生的?   java需要伪代码来进行文本压缩/解压缩   java JMS Websphere消息在发送时丢失   JUnit测试的Java SVNKit模拟单元测试   java Apache Crunch错误   java如何修复Android Studio/SQLite中的“空对象引用”错误?   java文件“navigation.json”在Android Studio项目中找不到   java如何在同一实体类上建立单向的一对一关系?   java调用web服务:javax。网ssl。SSLException:收到致命警报:协议\u版本   java与sql的连接   java Android:通过编程为透明背景图标(png)生成阴影,并在ImageButton中使用