有没有办法将更多的kwargs发送到函数调用中调用的函数中?
例:
def mydef(a, b):
print a
print b
mydict = {'a' : 'foo', 'b' : 'bar'}
mydef(**mydict) # This works and prints 'foo' and 'bar'
mybigdict = {'a' : 'foo', 'b' : 'bar', 'c' : 'nooooo!'}
mydef(**mybigdict) # This blows up with a unexpected argument error
Run Code Online (Sandbox Code Playgroud)
有没有办法传递mybigdict没有错误? 'c'永远不会mydef在我的理想世界中使用,只会被忽略.
谢谢,我的挖掘没有找到我想要的东西.
编辑:修改了一下代码.这mydef(a, b, **kwargs)是我正在寻找的形式,但检查功能args对我来说是一个新事物,绝对是我工具箱的东西.感谢大家!
如果我有一个类:
class Person(object):
def __init__(self, name, **kwargs):
self.name = name
p = Person(name='joe', age=25) # age is ignored
Run Code Online (Sandbox Code Playgroud)
额外的参数被忽略了.但如果我有一个namedtuple,我会得到'意外的关键字参数:
from collections import namedtuple
Person = namedtuple('Person', 'name')
p = Person(name='joe', age=25)
# Traceback (most recent call last):
# File "python", line 1, in <module>
# TypeError: __new__() got an unexpected keyword argument 'age'
Run Code Online (Sandbox Code Playgroud)
我怎样才能namedtuple接受kwargs所以我可以安全地传递额外的参数?
如何使用Python的多处理将字典传递给函数?文档:https://docs.python.org/3.4/library/multiprocessing.html#reference说传递字典,但我一直在
TypeError: fp() got multiple values for argument 'what'
Run Code Online (Sandbox Code Playgroud)
这是代码:
from multiprocessing import Pool, Process, Manager
def fp(name, numList=None, what='no'):
print ('hello %s %s'% (name, what))
numList.append(name+'44')
if __name__ == '__main__':
manager = Manager()
numList = manager.list()
for i in range(10):
keywords = {'what':'yes'}
p = Process(target=fp, args=('bob'+str(i)), kwargs={'what':'yes'})
p.start()
print("Start done")
p.join()
print("Join done")
print (numList)
Run Code Online (Sandbox Code Playgroud) 假设我有模块myscript.py; 该模块是生产代码,通常称为%dir%>python myscript.py foo bar.
我想扩展它以获取关键字参数.我知道我可以使用下面的脚本来获取这些参数,但不幸的是,我们必须使用它来调用它
%dir%>python myscript.py main(foo, bar).
我知道我可以使用该argparse模块,但我不知道该怎么做.
import sys
def main(foo,bar,**kwargs):
print 'Called myscript with:'
print 'foo = %s' % foo
print 'bar = %s' % bar
if kwargs:
for k in kwargs.keys():
print 'keyword argument : %s' % k + ' = ' + '%s' % kwargs[k]
if __name__=="__main__":
exec(''.join(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud) 类似于如何在scikit中仅将参数传递给管道对象的一部分?我想将参数传递给管道的一部分.通常,它应该工作正常,如:
estimator = XGBClassifier()
pipeline = Pipeline([
('clf', estimator)
])
Run Code Online (Sandbox Code Playgroud)
并执行像
pipeline.fit(X_train, y_train, clf__early_stopping_rounds=20)
Run Code Online (Sandbox Code Playgroud)
但它失败了:
/usr/local/lib/python3.5/site-packages/sklearn/pipeline.py in fit(self, X, y, **fit_params)
114 """
115 Xt, yt, fit_params = self._pre_transform(X, y, **fit_params)
--> 116 self.steps[-1][-1].fit(Xt, yt, **fit_params)
117 return self
118
/usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/sklearn.py in fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose)
443 early_stopping_rounds=early_stopping_rounds,
444 evals_result=evals_result, obj=obj, feval=feval,
--> 445 verbose_eval=verbose)
446
447 self.objective = xgb_options["objective"]
/usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/training.py in train(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, learning_rates, xgb_model, …Run Code Online (Sandbox Code Playgroud) 我在python中使用ConfigObj进行模板式插值.通过**展开我的配置字典似乎不进行插值.这是一个功能还是一个bug?有什么好的解决方法吗?
$ cat my.conf
foo = /test
bar = $foo/directory
>>> import configobj
>>> config = configobj.ConfigObj('my.conf', interpolation='Template')
>>> config['bar']
'/test/directory'
>>> '{bar}'.format(**config)
'$foo/directory'
Run Code Online (Sandbox Code Playgroud)
我希望第二行是/test/directory.为什么插值不能用**kwargs?
我有一个C++类,我正在使用boost :: python构建一个python模块.我有一些函数,我想采取关键字参数.我已经设置了包装函数来传递给raw_arguments,并且工作正常,但我想构建一些函数参数的错误检查.有没有标准的方法来做到这一点?
我的函数原型,在C++中,看起来有点像这样:
double MyClass::myFunction(int a, int b, int c);
Run Code Online (Sandbox Code Playgroud)
第三个参数是可选的,默认值为0(到目前为止,我已经使用宏在boost :: python中实现了这个).在python中,我希望能够实现以下行为:
MyClass.my_function(1) # Raises exception
MyClass.my_function(2, 3) # So that a = 2, b = 3 and c defaults to 0
MyClass.my_function(2, 3, 1) # As above, but now c = 1
MyClass.my_function(2, 3, 1, 3) # Raises exception
MyClass.my_function(3, 1, c = 2) # So a = 3, b = 1 and c = 2
MyClass.my_function(a = 2, b = 2, c = 3) # Speaks …Run Code Online (Sandbox Code Playgroud) 我知道如果函数接受,我可以将函数参数转换为字典**kwargs.
def bar(**kwargs):
return kwargs
print bar(a=1, b=2)
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
但是,情况恰恰相反?我可以将命名参数打包到字典中并返回它们吗?手动编码版本如下所示:
def foo(a, b):
return {'a': a, 'b': b}
Run Code Online (Sandbox Code Playgroud)
但似乎必须有更好的方法.请注意,我试图避免**kwargs在函数中使用(命名参数对于代码完成的IDE更有效).
我想传递一个dictionary:
items = {"artist": "Radiohead", "track": "Karma Police"}
Run Code Online (Sandbox Code Playgroud)
作为参数function:
def lastfm_similar_tracks(**kwargs):
result = last.get_track(kwargs)
st = dict(str(item[0]).split(" - ") for item in result.get_similar())
print (st)
Run Code Online (Sandbox Code Playgroud)
last.get_track("Radiohead", "Karma Police")调用本地的正确方法在哪里function.
然后像这样调用它:
lastfm_similar_tracks(items)
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
TypeError: lastfm_similar_tracks() takes exactly 0 arguments (1 given)
我该怎么纠正这个?
我正在尝试使用Python的type annotations抽象类.我的__init__功能看起来像这样:
from abc import ABCMeta
class SomeClass(object, metaclass=ABCMeta):
def __init__(self, *args, **kwargs):
print("Initiating %s object.", self.__class__.__name__)
self.username = kwargs['data']
assert isinstance(self.username, str)
is_premioum = kwargs.get('premioum', False)
self.money_investmant = kwargs.get('investmant')
if isinstance(self.money_investmant, str):
self.money_investmant = float(self.money_investmant)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,kwargs可能包含从几个数字类型-的参数float,bool和str.
现在,我正在尝试为函数编写类型注释,如下所示:
def __init__(self, *args, **kwargs: Union[bool, str, float]) -> None:
Run Code Online (Sandbox Code Playgroud)
但我的PyCharmIDE提醒我:
除了'Integral'类型,取而代之的是'str'
和:
在bool中找不到referance'get' str | 浮动'
难道我做错了什么?
如果kwargs包含来自多个类型的参数,我应该如何编写kwargs的类型注释?
kwargs ×10
python ×10
python-2.7 ×2
argparse ×1
boost-python ×1
c++ ×1
command-line ×1
configobj ×1
dictionary ×1
namedtuple ×1
pipeline ×1
python-3.x ×1
scikit-learn ×1
type-hinting ×1
typing ×1
xgboost ×1