gpt4 book ai didi

python - 是否有可能获得类似于 kwargs(python) 的传入参数字典?

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:23 25 4
gpt4 key购买 nike

我目前正在创建一个这样的对象:

class Obj(object):
def __init__(self,**kwargs):
params = ['val1','val2','val3','val4',...]
for p in params:
setattr(self,p,kwargs.get(p,None))

我正在这样做,所以我不必这样做:

class Obj(object):
def __init__(self,val1=None,val2=None,val3=None,val4=None,...):
self.val1=val1
self.val2=val2
self.val3=val3
self.val4=val4
...

我的问题是,您可以将两者混合使用吗?我在哪里可以定义预期的参数但仍然循环参数来设置属性?我喜欢定义预期参数的想法,因为它是 self 记录的,其他开发人员不必搜索使用的 kwargs。

我知道这看起来很琐碎,但我正在从一些 XML 创建一个对象,所以我将传递许多参数,这只会使代码困惑并让我感到烦恼。

我用谷歌搜索了这个但找不到任何东西,可能是因为字典和 kwargs 一起指向 kwarg 示例。

更新:更具体地说,是否可以获取传入参数的字典,这样我根本不必使用 kwargs

须藤代码:

class Obj(object):
def __init__(self,val1=None,val2=None,val3=None,val4=None,...):
for k,v in dictionary_of_paramters.iteritems():
setattr(self,k,v)

最佳答案

您可以使用检查模块:

import inspect

def myargs(val1, val2, val3=None, val4=5):
print inspect.currentframe().f_locals

它显示了当前栈帧上所有可用的局部变量。

myargs('a','b')
==> {'val3': None, 'val2': 'b', 'val1': 'a', 'val4': 5}

(注意:不能保证在所有 Python 解释器上实现)

编辑:我同意这不是一个很好的解决方案。我会做的更像是:

def _yourargs(*names):
"returns a dict with your named local vars"
alllocs = inspect.stack()[1][0].f_locals
return {n:alllocs[n] for n in names}

def askformine(val1, val2, val3=None, val4=5):
"example to show just those args i'm interested in"
print _yourargs('val1','val2','val3','val4')

class Obj(object):
"example inserting some named args as instance attributes"
def __init__(self, arg1, arg2=4):
self.__dict__.update(_yourargs('arg1','arg2'))

edit2 稍微好点:

def pickdict(d,*names):
"picks some values from a dict"
return {n:d[n] for n in names}

class Obj(object):
"example inserting some named args as instance attributes"
def __init__(self, arg1, arg2=4):
self.__dict__.update(pickdict(locals(),'arg1','arg2'))

关于python - 是否有可能获得类似于 kwargs(python) 的传入参数字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14057632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com