在python中我们可以这样做:
def myFun1(one = '1', two = '2'):
...
Run Code Online (Sandbox Code Playgroud)
然后我们可以调用函数并按名称传递参数:
myFun1(two = 'two', one = 'one')
Run Code Online (Sandbox Code Playgroud)
此外,我们可以这样做:
def myFun2(**kwargs):
print kwargs.get('one', 'nothing here')
myFun2(one='one')
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否可以将两种方法结合起来:
def myFun3(name, lname, **other_info):
...
myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')
Run Code Online (Sandbox Code Playgroud)
一般来说,我们可以做什么组合?
谢谢,对不起我的愚蠢问题.
我正在寻找将函数与包含比函数输入更多项的字典组合在一起的最佳方法
在这种情况下,基本**kwarg拆包失败:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我想出了以下方法:
import inspect
# utilities
def get_input_names(function):
'''get arguments names from function'''
return inspect.getargspec(function)[0]
def filter_dict(dict_,keys):
return {k:dict_[k] for k in keys}
def combine(function,dict_):
'''combine a function with a dictionary that may contain more items than the function's inputs '''
filtered_dict = filter_dict(dict_,get_input_names(function))
return function(**filtered_dict)
# examples
def foo(a,b):
return a + b
d = …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我想阅读obj.subject并将其放入var subject,也读取obj.body并放入body.首先,我想读取kwargs变量并在字符串中搜索要替换的关键字,如果不存在则继续.
我怎样才能kwargs在Python中进行迭代?
for key in kwargs:
subject = str(obj.subject).replace('[%s]' % upper(key), kwargs[key])
for key in kwargs:
body = str(obj.body).replace('[%s]' % upper(key), kwargs[key])
return (subject, body, obj.is_html)
Run Code Online (Sandbox Code Playgroud) 如果我有这样的python函数:
def some_func(arg1, arg2, arg3=1, arg4=2):
Run Code Online (Sandbox Code Playgroud)
有没有办法确定哪些参数是通过关键字从函数内部传递的?
编辑
对于那些问我为什么需要这个的人,我没有真正的理由,它出现在一次谈话中,好奇心让我变得更好.
我一直在阅读有关字符串格式的Python 3.2文档,但它并没有真正帮助我解决这个特殊问题.
这是我正在尝试做的事情:
stats = { 'copied': 5, 'skipped': 14 }
print( 'Copied: {copied}, Skipped: {skipped}'.format( stats ) )
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为format()调用不是读取字典值并使用它们代替我的格式占位符.如何修改我的代码以使用我的字典?
有更紧凑/有效的方法吗?
for key in kwargs:
if key == 'log':
self.log = kwargs[key]
elif key == 'bin':
self.bin = kwargs[key]
elif key == 'pid':
self.pid = kwargs[key]
elif key == 'conf':
self.conf = kwargs[key]
Run Code Online (Sandbox Code Playgroud) 我正在使用Django的pre_save信号来实现auto_now_add.互联网上有很多关于为什么你应该或不应该自己实现它的讨论.我不赞赏对此的评论.我是否应该重写保存功能(我有很多使用auto_now_add的模型,所以使用信号是有意义的).
我的问题是:
我想检查实例是否已创建或更新.根据互联网上的一些消息来源,可以通过测试是否kwargs['created']为True 来完成.但是'created',kwargs即使实例是新创建的,也不会出现在我的脑中.我只是想知道它是否曾经存在过,或者它已经神奇地消失了.我知道我也可以测试是否kwargs['instance'].id已设置(这实际上对我有用),但我想知道kwargs ['created']是否仍然存在.
从python doc和stackoverflow,我理解如何在我的def函数中使用**kwargs.但是,我有一个案例需要两套**kwargs用于两个子功能.有人能告诉我如何正确地分离**kwargs吗?
这是我的目标:绘制点集和插值平滑曲线,
以及我天真的示例代码:
def smoothy(x,y, kind='cubic', order = 3, **kwargs_for_scatter, **kwargs_for_plot):
yn_cor = interp1d(x, y, kind=kind, assume_sorted = False)
xn = np.linspace(np.min(x), np.max(x), len(x) * order)
plt.scatter(x,y, **kwargs_for_scatter)
plt.plot(xn, yn_cor(xn), **kwargs_for_plot);
return
Run Code Online (Sandbox Code Playgroud)
感谢帮助.
我使用Python 3并希望使用默认argparse.ArgumentParser设置的自定义类
进行换行formatter_class=argparse.RawDescriptionHelpFormatter.我可以成功地做到这一点,但IntelliJ IDEA 2017.1与Python插件(PyCharm)给出了以下代码的警告:
class CustomParser(argparse.ArgumentParser):
def __init__(self, formatter_class=argparse.RawDescriptionHelpFormatter, **kwargs):
# noinspection PyArgumentList
super().__init__(formatter_class=formatter_class, **kwargs) # warning in this line for the last argument if suppression comment above removed
Run Code Online (Sandbox Code Playgroud)
如果使用IntelliJ抑制命令删除注释,则对kwargs的警告是"预期字典,得到字典",但它正在工作.这是一个误报警告,还是在没有警告的情况下可以做得更好?这个警告背后是否有一个真正的问题,它有助于避免?
附带问题:使用
formatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)而不是在签名中明确定义命名参数是否有区别?根据PEP20,签名中更明确的更好,对吧?
kwargs ×10
python ×9
dictionary ×2
function ×2
python-3.x ×2
arguments ×1
django ×1
pass-by-name ×1
super ×1