标签: kwargs

将更多的kwargs传递给函数而不是最初设置

有没有办法将更多的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对我来说是一个新事物,绝对是我工具箱的东西.感谢大家!

python kwargs

8
推荐指数
2
解决办法
3435
查看次数

让namedtuple接受kwargs

如果我有一个类:

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 kwargs namedtuple python-2.7

8
推荐指数
2
解决办法
3773
查看次数

Python多处理 - 如何将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)

python multiprocessing kwargs

8
推荐指数
1
解决办法
8741
查看次数

Python:如何在从命令行调用时启用kwargs?(也许与argparse)

假设我有模块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)

python command-line kwargs python-2.7 argparse

8
推荐指数
4
解决办法
1万
查看次数

Sklearn将拟合参数传递给管道中的xgboost

类似于如何在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 pipeline kwargs scikit-learn xgboost

8
推荐指数
3
解决办法
4381
查看次数

为什么**kwargs不用python ConfigObj进行插值?

我在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?

python kwargs configobj

7
推荐指数
1
解决办法
421
查看次数

从boost :: python中的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)

c++ python kwargs boost-python

7
推荐指数
1
解决办法
2697
查看次数

将命名参数打包成dict

我知道如果函数接受,我可以将函数参数转换为字典**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更有效).

python dictionary kwargs

7
推荐指数
1
解决办法
1475
查看次数

Python - 在本地函数调用中解压缩kwargs

我想传递一个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 kwargs

7
推荐指数
3
解决办法
8065
查看次数

在**kwargs中键入多个类型的注释

我正在尝试使用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,boolstr.

现在,我正在尝试为函数编写类型注释,如下所示:

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的类型注释?

python typing type-hinting kwargs python-3.x

7
推荐指数
1
解决办法
1347
查看次数