字符串格式和 Kwargs

Strings Formatting and Kwargs

以下代码可以正常工作:

def myfunc(**kwargs):
if 'fruit' in kwargs:
    print('my fruit of choice is {}'.format(kwargs['fruit']))
else:
    print('No Fruit Here')
myfunc(fruit = 'apple', veggie = 'lettuce)

以下代码returns错误:

def myfunc(**kwargs):
if 'fruit' in kwargs:
    print(f'my fruit of choice is {fruit}')
else:
    print('No Fruit Here')
myfunc(fruit = 'apple', veggie = 'lettuce)

Returns: NameError: 名称 'fruit' 未定义

我该如何正确格式化它?而且,为什么它不像我尝试的那样工作?是因为**kwargs吗?

感谢您的帮助和解释。

关闭,应该是kwargs['fruit']因为kwargs是一个包含所有函数参数的dict

def myfunc(**kwargs):
    print(kwargs)
    if 'fruit' in kwargs:
        print(f"my fruit of choice is {kwargs['fruit']}")
    else:
        print('No Fruit Here')
myfunc(fruit = 'apple', veggie = 'lettuce')
#{'fruit': 'apple', 'veggie': 'lettuce'}
#my fruit of choice is apple

问题是这两种情况并不等同。第一种情况:

print('my fruit of choice is {}'.format(kwargs['fruit']))

您指的是存在的对象 kwargs['fruit']。这将转换为 f 字符串:

print(f'my fruit of choice is {kwargs["fruit"]}')

在第二种情况下,f 字符串等同于:

print('my fruit of choice is {}'.format(fruit))

这会给你同样的错误,因为名为 fruit 的对象不存在。

这是因为您的函数使用了可变数量的 kwargs,这实际上创建了一个名为 kwargsdict 供您的函数在本地引用。但是,如果您将函数创建为:

def myfunc(fruit=None, veggie=None, **kwargs):

然后 fruitveggie 名称将在本地为您的函数所知,此外还有 kwargs 字典中未定义的关键字参数。