首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何处理多个关键字参数?

如何处理多个关键字参数?
EN

Stack Overflow用户
提问于 2018-07-16 05:38:18
回答 2查看 3.1K关注 0票数 2

当使用相同的键传递两个关键字参数时,我在定义一个用户友好的函数接口时遇到了一些困难。

问题

怎样才能调用一个函数,其中两个关键字参数具有相同的键,而第二个关键字参数具有优先

如果出现此问题,第一个关键字参数总是来自于dict中解压缩的数据库,而第二个关键字参数总是以“直接”作为关键字参数来传递。

数据库字典值不能在函数的外部范围内被覆盖,因为它们可能被多次使用。

编辑:为了保持该函数对用户的可用性,首选使用backend-implementation。这意味着用户可以简单地将参数传递给函数,而不需要使用其他模块,而函数本身则具有所有的魔力。

问题

这里有一个名为fun_one的函数,它接收由我的程序的用户直接定义的大量参数。例如,这可能是换热器的lengthwidth。为了简化函数的使用,使调用代码尽可能短,鼓励使用数据库。这些数据库包含dict (或熊猫系列)中的数据,在本例中称为inputs

为了将数据库-dict inputs传递给函数,它使用**inputs解压缩,从而作为关键字参数传递。

现在如果用户想要覆盖数据库的一个特定参数,我对用户友好方法的理解就是让他再次传递前面的参数,例如使用length=23.7,然后在内部覆盖数据库中的参数。但是,当然(参见示例代码),这会在我输入可以try/except的函数之前引发错误。

TypeError: fun_one()获得关键字参数'length‘的多个值

代码示例复制错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun_one(*args, **kwargs):  # short example function
    print(kwargs)

inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': np.random.rand(3)}

fun_one(**inputs, length=23.7)

我的当前解决方案

我当前的解决方案fun_two涉及到,而不是解压缩数据库并将其传递给*args。它检查*args是否为dict,并将尚未在kwargs中设置的值设置为kwargs,如下面的代码示例所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun_two(*args, **kwargs):  # example function printing kwargs
    print(kwargs)  # print kwargs before applying changes
    for arg in args:  # find dicts
        if type(arg) is dict:
            for key, val in arg.items():  # loop over dict
                _ = kwargs.setdefault(key, val)  # set val if key not in dict
    print(kwargs)  # print kwargs after applying changes

inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': np.random.rand(3)}

fun_two(inputs, length=23.7)

但是对于用户来说,这种方法是相当模糊的,需要在相当多的函数开始时进行循环和检查,因为这将适用于许多函数。(我将把它外包给一个模块,因此每一个函数都是一行。但它仍然偏离了我对一个简单而明确的函数定义的理解)。

有什么更好的方法(更多的毕加索)来做这件事吗?在调用函数的过程中,我是否监督了某种方法?表现并不重要。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 05:46:46

最简单的解决方案是使用ChainMap from collections (手册页)。这样,您就可以选择哪些参数具有优先级。示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import ChainMap

def fun_one(*args, **kwargs):  # short example function
    print(kwargs)

inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': 1}

c = ChainMap({'length': 23.7}, inputs)  # we overwrite length here
fun_one(**c)

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'some_other_args': 1, 'width': 1.1, 'length': 23.7}

如果我们只使用输入调用fun_one:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = ChainMap(inputs)
# or c = inputs
fun_one(**c)

产出将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'width': 1.1, 'length': 15.8, 'some_other_args': 1}

来自手册:

ChainMap将多个dicts或其他映射组合在一起,以创建单个可更新的视图。如果没有指定映射,则提供一个空字典,以便新链始终至少有一个映射。

您可以将此ChainMap封装在装饰器中,一个更改是不使用**input调用fun_one(),只调用input

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import ChainMap

def function_with_many_arguments(func):
    orig_func = func
    def _f(*args, **kwargs):
        if args:
            c = ChainMap(kwargs, args[0])
            return orig_func(**c)
        else:
            return orig_func(*args, **kwargs)
    return _f

@function_with_many_arguments
def fun_one(*args, **kwargs):  # short example function
    print(kwargs)

inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': 1}
fun_one(inputs, length=23)

指纹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'some_other_args': 1, 'length': 23, 'width': 1.1}
票数 6
EN

Stack Overflow用户

发布于 2018-07-16 06:34:20

作为Andrej答案的扩展(再次感谢!),我添加了一个ChainMaps循环,以便在同一个函数中使用多个数据库,并能够使用各种位置参数。多个数据库的优先级是先到先得的,但在这种情况下这是可以的。这位是装修师:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def function_with_many_arguments(func):
    orig_func = func
    def _f(*args, **kwargs):
        if args:
            c = ChainMap(kwargs)
            for arg in args:
                if type(arg) is dict:
                    c = ChainMap(c, arg)
            orig_func(*args, **c)
        else:
            orig_func(*args, **kwargs)
    return _f

下面是我扩展的示例函数,它有一些代码来测试它。我只是加入了所有的随机论点,没有考虑到任何毕不过的方法.;)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@function_with_many_arguments
def fun_one(a, b, *args, name, database=None, **kwargs):
    print(name)
    print(a, b)
    print(kwargs)

inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': np.random.rand(3)}
inputs2 = inputs.copy()
inputs2['width'] = 123
inputs2['weight'] = 3.8

fun_one(4, 8, inputs, database=inputs2, name='abc', length=23.8, weight=55)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51363208

复制
相关文章
Unicode中的空格字符一览(翻译)
本文列出了 Unicode 中的各种空格字符。有关说明, 还请参阅 Unicode 标准中的 第6章 书写系统和标点符号 还有Unicode标准中的 一般标点符号的区段描述 。本文还列出了3个宽度为0的字符, 故可称其为零宽度空格。
Kitov
2022/09/28
10.6K0
Unicode中的空格字符一览(翻译)
js --- 中字符串与unicode编码
2、charCodeAt ():在第一个的基础上,返回的是字符的unicode编码
小蔚
2019/09/11
4.9K0
Python脚本处理unicode字符时的解决方法
我们在Python中,可以使用Unicode编码来表示字符。Unicode是一种字符集,它为世界上几乎所有的字符都分配了一个唯一的数字,这个数字被称为码点。在Python中,在使用Unicode字符出现的问题又该
华科云商小徐
2024/03/12
1450
Unicode不可见字符
不可见字符”\u200b”为 Unicode Character ‘ZERO WIDTH SPACE’ (U+200B),可用于内容标识,不占位数。
周小董
2019/03/25
5.6K0
Unicode不可见字符
可以直接用于HTML中的特殊字符表 unicode字符集
目录 箭头类 基本形状类 货币类 数学类 音乐符号类 对错号 全都是星星 星座类 国际象棋类 扑克牌类 希腊字母 十字 法律符号 标点和符号 ⇠ 箭头类 符号UNICODE符号UNICODEHTMLJSCSSHTMLJSCSS⇠&#8672u21E021E0⇢&#8674u21E221E2⇡&#8673u21E121E1⇣&#8675u21E321E3↞&#8606u219E219E↠&#8608u21A021A0↟&#8607u219F219F↡&
拿我格子衫来
2022/01/24
2.7K0
Unicode 字符串
引号前小写的"u"表示这里创建的是一个 Unicode 字符串。如果你想加入一个特殊字符,可以使用 Python 的 Unicode-Escape 编码。如下例所示:
用户8442333
2021/05/27
1K0
面试题-Unicode字符与编码如何互转
说起 Unicode 字符与编码的互转,我们很容易想到 charCodeAt 和 fromCharCode 两个方法。
用户10106350
2022/10/28
4150
如何解决缺少msvcr110.dll?[通俗易懂]
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_42680327
全栈程序员站长
2022/11/17
5640
如何解决缺少msvcr110.dll?[通俗易懂]
解决WebService中System.InvalidOperationException:缺少参数的问题
此问题在.Net 4.0 IIS7 Windows Server 2008下可能会出现。 现象是第一次正常调用,第二次接口报错。 删除CacheDuration即可。
从今若
2019/09/18
2.7K1
字符编码ascii、unicode、ut
计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码。ASIIC码包括数字大小写字母和常用符号,一共128个,1字节(byte)=8bit,8bit能表示的最大数是256,所以ASIIC编码中一个字符的大小就是1个字节
py3study
2020/01/19
9430
unicode字符串解析
在http接口接收时,很多接口提供方都喜欢把汉字通过unicode的方式传过来,而数字和字母保持不变,就像这样。
逝兮诚
2019/10/30
1.4K0
Word反查字符的unicode码
最近写字符处理的相关程序,需要和字符编码打交道,Windows自带的字符映射表只能通过unicode码查找字符,但是测试时通常要通过字符查找其unicode码,使用起来很不方便。
极客中心
2021/01/21
1.5K0
Word反查字符的unicode码
如何解决pytest参数化时出现的Unicode编码问题?
Pytest是一个广泛使用的Python测试框架,通过参数化测试(Parameterized Testing)功能,可以轻松地为测试用例提供多组输入数据。然而,当我们尝试在参数化测试中使用中文作为测试用例的IDs时,有时会遇到Unicode编码问题,导致测试报告中显示的是乱码。本文将详细解释这个问题的原因,并提供解决方案,确保测试报告中正确显示中文IDs。
霍格沃兹测试开发Muller老师
2023/09/07
4670
如何解决pytest参数化时出现的Unicode编码问题?
Pytest是一个广泛使用的Python测试框架,通过参数化测试(Parameterized Testing)功能,可以轻松地为测试用例提供多组输入数据。然而,当我们尝试在参数化测试中使用中文作为测试用例的IDs时,有时会遇到Unicode编码问题,导致测试报告中显示的是乱码。本文将详细解释这个问题的原因,并提供解决方案,确保测试报告中正确显示中文IDs。
霍格沃兹测试开发Muller老师
2023/08/08
2820
如何解决pytest参数化时出现的Unicode编码问题?
VB中Unicode的转换
    VB本身的字符串格式就是Unicode,用Winsock发送字符串的话,会默认把字符串转换为Ansi的格式进行发送。Ansi格式,对于英文符号等仍然使用单字节,汉字使用双字节。如果需要进行转换的话,可以用StrConv来进行。     如:           Dim   byteFileName()   As   Byte             byteFileName   =   StrConv(m_filename,   vbFromUnicode)       '   Conver
用户1075292
2018/01/23
1.9K0
解决python 缺少 'python.
greenlet.h:8:20: 致命错误: Python.h:没有那个文件或目录
py3study
2020/01/10
1.3K0
小知识:Docker环境缺少vi命令,如何解决
docker exec可以使用--user参数指定root用户,进入安装vi即可:
Alfred Zhao
2021/11/30
1.8K0
如何在系统中添加字体(添加字体到系统)
笔者最近在使用win10自带的OneNote笔记本记笔记的时候,发现笔者电脑中没有华文新魏这个字体,最开始以为是OneNote不带有这个字体,经过一段时间的收集资料后发现,是笔者电脑win10系统中不带有这个字体,现将有关概念和字体安装方法做一下记录。
全栈程序员站长
2022/08/01
4K0
如何在系统中添加字体(添加字体到系统)
684. 缺少的字符串分解到vector中借助find函数
先把两个字符串都分解到vector中,以空格为标志,然后在借助find函数来找出两个vector中不同的单词。
和蔼的zhxing
2018/09/04
7320
Flutter中如何设置全局字体
首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件,如:
BennuCTech
2022/11/11
3K0
Flutter中如何设置全局字体

相似问题

如何发送正确的JSON响应消息格式

12

以JSON格式发送日志消息

00

云函数发送json作为映射

12

如何通过Jmeter发送格式正确的MQ消息

111

无法使用云函数发送FCM消息

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文