Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 偏微分方程的大致等价码_Python - Fatal编程技术网

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)