Python 偏微分方程的大致等价码
在官方文件中 关于局部 大致相当于:Python 偏微分方程的大致等价码,python,Python,在官方文件中 关于局部 大致相当于: def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func n
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
我想如果将其重构为:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
return func(*args, *fargs, **fkeywords, **keywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
或
我的假设有意义吗?您的第一个版本不太有效,因为,正如我们所解释的: 如果提供了其他关键字参数,它们将扩展和覆盖关键字 在您的版本中,当您执行两个关键字splat时,您不会覆盖重复的关键字;相反,您会得到一个
TypeError
,如中所述:
如果语法**表达式出现在函数调用中,则表达式必须计算为映射,其内容将被视为附加关键字参数。如果关键字已经存在(作为显式关键字参数,或来自另一个解包),则会引发TypeError异常
比较:
>>> def sub(a, b): return a-b
>>> sub2 = functools.partial(sub, b=2)
>>> sub2(5, b=0)
5
>>> sub2 = partial(sub, b=2)
>>> sub2(5, b=0)
TypeError: f() got multiple values for keyword argument 'b'
您的第二个版本无法运行,原因有四:
是一个元组,元组没有*args
。由于不可变,很少有理由复制它们copy
- 元组也没有
,是不可变的追加
- 即使它们是列表,
也会将新的参数列表作为单个参数添加到末尾,但您希望将它们都作为单独的参数添加。这就是扩展的目的append
- 最后,您使用了
而不是args
newargs
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newargs = list(args)
newkeywords.update(fkeywords)
newargs.extend(fargs)
return func(*newargs, **newkeywords)
但一种更简单(更有效)的写作方式是:
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
newargs = args + fargs
return func(*newargs, **newkeywords)
事实上,这与Python在3.5中允许在一次调用中使用多个splat之前的partial
文档非常接近。在和中:
唯一的区别是它们直接在splat中执行
args+fargs
,而不是将其分配给newargs
变量。您尝试过这两种方法吗?如果fkeywords
和keywords
共享相同的参数.ty,则第一次重写将失败。关于允许多个splat
的扩展主题似乎很复杂这里的splat是什么意思?我谷歌多个splat没有返回任何有用的内容。@john抱歉,“splat”是一个非正式术语,用于使用*
(或**
)传递序列(或映射)以将其解包为多个位置(或关键字)参数。“splat”的正式术语是“使用iterable解包语法”。如果你在谷歌上搜索“允许多个splats python”,你会得到更好的结果。(包括允许在Python 3.5中开始的函数调用中多次使用*
)
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
newargs = args + fargs
return func(*newargs, **newkeywords)
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)