我有一点问题.
我argparse用来解析我的论点,而且它运作得很好.
有了args,我这样做:
p_args = parser.parse_args(argv)
args = dict(p_args._get_kwargs())
Run Code Online (Sandbox Code Playgroud)
但问题p_args是我不知道如何通过它们在命令行中的位置来排序这些参数,因为它是一个字典.
那么有没有可能在命令行中按顺序在元组/列表/有序字典中包含参数?
有没有办法在函数调用期间将键值对添加到kwargs中?
def f(**kwargs):
print(kwargs)
# ...
pre_defined_kwargs = {'a': 1, 'b': 2}
f(**pre_defined_kwargs, c=3)
Run Code Online (Sandbox Code Playgroud)
甚至改变现有的论点?
f(**pre_defined_kwargs, b=3) # replaces the earlier b=2
Run Code Online (Sandbox Code Playgroud)
这两个例子不起作用,因为它们会引起错误
>>> f(**pre_defined_kwargs, c=3)
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
指着论点之间的逗号
有没有一种方法可以定义,__init__因此定义的关键字**kwargs被分配给类?
例如,如果我要初始化一个ValidationRule类ValidationRule(other='email'),self.other则应将值添加到类中,而不必为每个可能的kwarg明确命名.
class ValidationRule:
def __init__(self, **kwargs):
# code to assign **kwargs to .self
Run Code Online (Sandbox Code Playgroud) 从外部文件我生成以下字典:
mydict = { 'foo' : 123, 'bar' : 456 }
Run Code Online (Sandbox Code Playgroud)
给定一个带**kwargs参数的函数,如何从该字典生成keyword-args?
我有一个带有此签名的python函数:
def post_message(self, message, *args, **kwargs):
Run Code Online (Sandbox Code Playgroud)
我想从c ++调用函数并传递给它一些kwargs.调用函数不是问题.知道如何通过kwargs是.这是一个非工作的释义样本:
std::string message("aMessage");
boost::python::list arguments;
arguments.append("1");
boost::python::dict options;
options["source"] = "cpp";
boost::python::object python_func = get_python_func_of_wrapped_object()
python_func(message, arguments, options)
Run Code Online (Sandbox Code Playgroud)
当我运用这段代码时,在pdb中我得到了(这不是我想要的):
messsage = aMessage
args = (['1'], {'source': 'cpp'})
kwargs = {}
Run Code Online (Sandbox Code Playgroud)
你如何在我的例子中传递**kwargs字典中的选项?
我看过一篇建议使用**选项语法的帖子(这有多酷!):
python_func(message, arguments, **options)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这导致了
TypeError: No to_python (by-value) converter found for C++ type: class boost::python::detail::kwds_proxy
Run Code Online (Sandbox Code Playgroud)
感谢您提供任何帮助.
我有一个Python类,其方法应该以这种方式接受参数和关键字参数
class plot:
def __init__(self, x, y):
self.x = x
self.y = y
def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs):
for arg in args:
<do something>
for key in kwargs:
<do somethng else>
Run Code Online (Sandbox Code Playgroud)
打电话时:
plt = plot(x, y)
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3")
Run Code Online (Sandbox Code Playgroud)
我收到错误: TypeError: set_axis() got multiple values for keyword argument 'xlabel'
无论如何,如果我设置我的方法
class plot:
def __init__(self, x, y):
self.x = x
self.y = y
def set_axis(self, xlabel="x", ylabel="y", *args, **kwargs):
for arg in args:
<do something>
for key in kwargs: …Run Code Online (Sandbox Code Playgroud) 我想通过Pool.map()将关键字参数传递给我的worker-function.在搜索论坛时,我找不到一个明确的例子.
示例代码:
import multiprocessing as mp
def worker((x,y), **kwargs):
kwarg_test = kwargs.get('kwarg_test', False)
print("kwarg_test = {}".format(kwarg_test))
if kwarg_test:
print("Success")
return x*y
def wrapper_process(**kwargs):
jobs = []
pool=mp.Pool(4)
for i, n in enumerate(range(4)):
jobs.append((n,i))
pool.map(worker, jobs) #works
pool.map(worker, jobs, kwargs) #how to do this?
def main(**kwargs):
worker((1,2),kwarg_test=True) #accepts kwargs
wrapper_process(kwarg_test=True)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
输出:
kwarg_test = True
Success
kwarg_test = False
kwarg_test = False
kwarg_test = False
kwarg_test = False
TypeError: unsupported operand type(s) for //: 'int' and 'dict' …Run Code Online (Sandbox Code Playgroud) 在python中,我写了这个函数来教自己如何**kwargs在Python中工作:
def fxn(a1, **kwargs):
print a1
for k in kwargs:
print k, " : ", kwargs[k]
Run Code Online (Sandbox Code Playgroud)
然后我调用了这个函数
fxn(3, a2=2, a3=3, a4=4)
Run Code Online (Sandbox Code Playgroud)
这是我的Python解释器打印的输出:
3
a3 : 3
a2 : 2
a4 : 4
Run Code Online (Sandbox Code Playgroud)
为什么for循环在a2的值之前打印a3的值,即使我先将a2输入到我的函数中?
I have a class that inherits from 2 other classes. These are the base classes:
class FirstBase(object):
def __init__(self, detail_text=desc, backed_object=backed_object,
window=window, droppable_zone_obj=droppable_zone_obj,
bound_zone_obj=bound_zone_object,
on_drag_opacity=on_drag_opacity):
# bla bla bla
class SecondBase(object):
def __init__(self, size, texture, desc, backed_object, window):
# bla bla bla
Run Code Online (Sandbox Code Playgroud)
And this is the child:
class Child(FirstBase, SecondBase):
""" this contructor doesnt work
def __init__(self, **kwargs):
# PROBLEM HERE
#super(Child, self).__init__(**kwargs)
"""
#have to do it this TERRIBLE WAY
def __init__(self, size=(0,0), texture=None, desc="", backed_object=None,
window=None, droppable_zone_obj=[], bound_zone_object=[], …Run Code Online (Sandbox Code Playgroud) 我有类似于此处概述的情况,除了不是使用多个参数链接任务,我想链接返回具有多个条目的字典的任务.
这是 - 非常松散和抽象 - 我正在努力做的事情:
tasks.py
@task()
def task1(item1=None, item2=None):
item3 = #do some stuff with item1 and item2 to yield item3
return_object = dict(item1=item1, item2=item2, item3=item3)
return return_object
def task2(item1=None, item2=None, item3=None):
item4 = #do something with item1, item2, item3 to yield item4
return_object = dict(item1=item1, item2=item2, item3=item3, item4=item4)
return return_object
Run Code Online (Sandbox Code Playgroud)
从ipython开始,我可以单独和异步地调用task1,没有任何问题.
我也可以单独调用task2,task1返回的结果为双星参数:
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
Run Code Online (Sandbox Code Playgroud)
但是,我最终想要实现的是与上面相同的最终结果,但是通过链,在这里,我无法弄清楚如何将task2实例化而不是使用task1返回的(位置)参数,而是使用task1.result作为**kwargs:
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK! …Run Code Online (Sandbox Code Playgroud) kwargs ×10
python ×9
argparse ×1
args ×1
arguments ×1
boost-python ×1
celery ×1
chain ×1
constructor ×1
inheritance ×1
methods ×1
python-2.7 ×1
python-3.x ×1
syntax ×1