为什么 kwargs 关键字在 Python 中既是字符串又不是字符串?

Why kwargs keyword given both as string and not as string in Python?

下面这个非常简单的代码块要求关键字鸟首先作为字符串出现,然后作为字符串出现。 在:

def myfunc(**kwargs):
    if 'bird' in kwargs:
        print('We roast {} for Thanksgiving'.format(kwargs['bird']))
    else:
        print("We're vegan")
myfunc(bird = 'turkey')

输出:

We roast turkey for Thanksgiving

为什么在 if 语句和 format 参数中,单词 bird 必须以字符串形式呈现,但稍后调用时函数(即 myfunc(bird = 'turkey') 一定不能写成字符串?我保证,在发帖之前我已经尝试寻找这个问题的答案。感谢您的帮助!

从哲学的角度来说,参数的 ** 语法跨越了两个不同世界的边界——程序本身的世界和程序运行的数据的世界。

当您像 Tim Roberts 在评论中所写的那样使用关键字参数来决定哪个实际参数与哪个形式参数匹配时,您就坚定地停留在“程序”世界中。如果你有一个程序

def myfunc(bird, stone=None):

然后用

调用它
myfunc(bird='Turkey')

bird 名称实际上不必存在于 运行 程序中。在编译语言中,编译器可能只记得“将 Turkey 作为第一个参数传递,而没有作为第二个参数传递”,这就足够了。

然而,当你这样做时

def myfunc(**kwargs)

名字bird突然从程序跳到数据的边界,所以我们需要一种方法来处理名字bird作为数据。某些语言,如 Lisp 和 PostScript,具有将名称作为数据处理的特殊语法(Lisp 中的 'bird,PostScript 中的 /bird),但 Python 选择简单地使用字符串。它 可能 也需要调用来使用字符串,即

myfunc('bird'='Turkey')

(这会允许 myfunc('bi'+'rd'='Turkey') 之类的事情。)

要知道为什么没有选择它,我们必须采访 Guido,但一个不错的猜测是“打字太多,使用 ** 调用语法并没有真正买到任何东西”。