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

如何处理多个关键字参数?
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
运行
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
运行
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
运行
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
运行
AI代码解释
复制
{'some_other_args': 1, 'width': 1.1, 'length': 23.7}

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

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

产出将是:

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

来自手册:

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

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

代码语言:javascript
运行
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
运行
AI代码解释
复制
{'some_other_args': 1, 'length': 23, 'width': 1.1}
票数 6
EN

Stack Overflow用户

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

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

代码语言:javascript
运行
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
运行
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

复制
相关文章
python for循环多个参数处理_python for循环嵌套
实际上,“使用for循环遍历数组的最简单方法”(Python类型被命名为“list”BTW)是第二种方法,即for item in somelist:
全栈程序员站长
2022/09/22
2.3K0
PythonWebServer如何同时处理多个请求
源于知乎上一个问题:https://www.zhihu.com/question/56472691/answer/293292349
the5fire
2019/03/01
1.9K0
【Python】函数进阶 ① ( 函数返回多个返回值 | 函数参数传递类型简介 | 位置参数 | 关键字参数 )
在函数中 , 如果要 返回 多个返回值 , 可以 在 return 语句中 , 设置多个返回值 , 这些返回值之间使用 逗号 隔开 , 这些返回值的类型是 元组 tuple 类型的 ;
韩曙亮
2023/10/11
1.6K0
【说站】python关键字如何传递参数
1、关键词传递以“形参变量名=实参”的形式参与实参关联,根据形参的名称进行参数传递,使实参和形参的顺序不一致。
很酷的站长
2022/11/23
9460
Python函数参数总结(位置参数、默认参数、可变参数、关键字参数和命名关键字参数)
Python函数的参数多达5种,不像Java那样参数只有一种,而是像C++那样提供默认参数,除此之外,还提供可变参数、关键字参数、命名关键字参数,这样就使得Python函数的参数变得十分复杂。但复杂意味着灵活便捷,Python语言之所以流行起来,与起本身巨大的灵活性是分不开的。可以说Python是最方便使用的语言。 Python参数类型: - 位置参数(positional arguments,官方定义,就是其他语言所说的参数) - 默认参数(类似C++的默认参数) - 可
Steve Wang
2018/02/05
22.3K0
Python函数参数总结(位置参数、默认参数、可变参数、关键字参数和命名关键字参数)
Golang 获取GET、POST参数及处理上传多个文件
http.request的三个属性Form、PostForm、MultipartForm:
IT工作者
2022/06/30
2.1K0
Python 的 map 函数也可以处理多个参数的函数
比起 map 带给程序员的理解负担,大多数 Python 程序员更喜欢列表推导来解决问题。
somenzz
2022/10/25
2.9K0
Python 的 map 函数也可以处理多个参数的函数
python返回多个参数
比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:
狼啸风云
2020/07/16
2.7K0
Python 关键字参数和可变参数
如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过命名它们来给这些参数赋值——这就是python关键字参数(Keyword Arguments)——我们使用命名(关键字)而非位置(一直以来我们所使用的方式)来指定函数中的参数。
py3study
2020/01/16
1.2K0
JS中如何处理多个ajax并发请求?
通常 为了减少页面加载时间,先把核心内容显示处理,页面加载完成后再发送ajax请求获取其他数据 这时就可能产生多个ajax请求,为了用户体验,最好是发送并行请求,这就产生了并发问题,应该如何处理? (1)并行改串行 如果业务逻辑和用户体验允许的情况下,可以改为串行,处理起来最简单 function async1(){ //do sth... async2(); } function async2(){ //do sth... } async1(); (2)回调计数 function
dys
2018/04/02
5.5K0
函数的关键字参数
def func1(name, age, sex, *args): ''' 打印姓名,年龄,性别 ''' print(name) print(age) print(sex) # func1('python', 28,sex='man','s','23') ## 工作经验:不定长参数都是放到最后 func1(name='python', age=30, sex='nv') help(func1) # def func1(a,b, c=100,*args,**
汪凡
2018/05/29
5470
Seata如何处理跨多个请求的事务?
Seata 是一种开源的分布式事务解决方案,能够处理跨多个请求的事务,适用于各种容器、语言和数据访问类型。在微服务架构下,依赖多个服务的操作可能导致分布式事务的问题。Seata 提供了完整的解决方案以确保数据的一致性和可靠性。
用户1289394
2023/09/11
2940
Seata如何处理跨多个请求的事务?
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.8K0
Logstash:处理多个 input
这里的 input 可以支持多个 input,同时多个 worker 可以处理 filter 及 output:
腾讯云大数据
2020/07/31
2.8K0
Logstash:处理多个 input
如何优雅地处理命令行参数?
我们在Linux用到的命令常常支持很多参数,那么如何写一个程序,也像Linux命令一样支持很多参数呢?有什么什么优雅的处理方法?
编程珠玑
2019/08/21
1.1K0
如何给PHP添加多个错误处理函数
一些常规的PHP框架都会对PHP的错误、异常进行异常处理封装,方便框架日志记录,开发的时候方便处理。我们先看看几个框架错误处理:
写PHP的老王
2019/08/12
1.9K0
如何给PHP添加多个错误处理函数
图像处理中C++如何同时返回多个值
1 . pair<T,T> 返回两个值 //返回两个值的情况 pair<vector<double>,int> R_R(Mat& img) { int n=img.rows; vector<double> a; unsigned int m=img.cols; unsigned int k=img.rows; for(unsigned int i=0;i<m;i++) { for(unsigned int j=0;j<k;j++)
用户9831583
2022/06/16
8000
mybatis 使用tips - 使用多个参数
执行如下命令: mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate 可以使用mybatis generator mybatis 使用多个参数 自定义方法需要根据多个查询条件去查询: SELECT * FROM `db_demo`.`hot_topic` WHERE lang='english' AND category='017' AND topic_type='video' ORDER BY score DESC; 推荐使用
千往
2018/01/24
1.7K0
方法关键字WebMethod,参数关键字Abstract,Constraint,Deprecated
指定此方法是否为web method。仅适用于定义为web service或web客户端的类。
用户7741497
2022/07/07
4210
Swift 使用lexicographicallyprecedes 多个参数排序
版权声明:转载请标明出处 https://blog.csdn.net/ZY_FlyWay/article/details/89184264
星宇大前端
2019/04/18
1.2K0
Swift  使用lexicographicallyprecedes 多个参数排序

相似问题

如何处理Django RestFramework中的多个关键字参数

220

处理多个对象时意外的关键字参数

11

带有多个(关键字)参数的Python中的多处理

13

Python多处理关键字参数

10

JavaScript参数关键字和多个参数...args

2310
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文