gpt4 book ai didi

python - Python 中**kwargs 的正确使用方法

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:09 26 4
gpt4 key购买 nike

我看了一下this question但它并不能完全回答我的问题。例如,我采用了一种简单的方法来打印我的名字。

def call_me_by_name(first_name):
print("Your name is {}".format(first_name))

后来,我意识到我还可以选择打印中间名和姓氏。我做了以下更改以适应使用 **kwargs 担心将来我可能会被要求为名称本身添加更多字段(例如第 3、4、5 个名称等)

我决定使用**kwargs

def call_me_by_name(first_name,**kwargs):

middle_name = kwargs['middle_name'] if kwargs.get('middle_name') else ""
last_name = kwargs['last_name'] if kwargs.get('last_name') else ""

print("Your name is {} {} {}".format(first_name,middle_name,last_name))

我唯一担心的是,随着我继续实现对更多名称的支持,我最终会为每个可能出现也可能不会出现的关键字参数编写一行代码。我想找到一个尽可能 pythonic 的解决方案。有没有更好的方法来实现这一目标?

编辑 1

我想使用关键字参数,因为这只是一个示例程序。实际用例是解析文件。截至目前,关键字参数将支持从

解析文件

1) 文件中的特定字节。
2) 文件中的特定行号。

在任何给定的时间点只能设置这两个条件中的一个(因为不可能同时从文件中的特定字节偏移量和行号读取。)但可能有更多这样的条件将来的条件,例如从第一次出现的字符解析文件等。可能有 10-20 种不同的条件,我的方法应该支持,但只有其中一个条件可以由调用者随时设置。我不想有 20-30 个不同的 IF 条件,除非没有其他选择。

最佳答案

你有两个不同的问题,用两种不同的 pythonic 方式来回答这些问题。

1- 您首先担心的是,您不想在格式化字符串时开始支持的参数越多,就继续添加新行。解决这个问题的方法是使用 defaultdict,这样当您不提供特定的关键字参数和 str.format_map 接受一个 dict 作为输入关键字参数以格式化的一种方式。这样,您只需更新字符串和要打印的关键字参数:

from collections import defaultdict
def call_me_by_name(**kwargs):
default_kwargs = defaultdict(str, kwargs)
print("Your name is {first_name} {second_name} {third_name}".format_map(default_kwargs))

2- 另一方面,如果在回答第二个问题时,您想根据关键字参数提供不同的行为,例如更改字符串的外观或提供不同的文件查找功能,而不使用 if 语句,您有添加不同的函数/方法并从这个通用函数/方法中调用它们。这里有两种方法:

面向对象:

class FileLookup:

def parse(self, **kwargs):
return getattr(self, next(iter(kwargs)))(**kwargs)

def line_number(self, line_number):
print('parsing with a line number: {}'.format(line_number))

def byte_position(self, byte_position):
print('parsing with a byte position: {}'.format(byte_position))

fl = FileLookup()
fl.parse(byte_position=10)
fl.parse(line_number=10)

模块:

def line_number(line_number):
print('parsing with a line number: {}'.format(line_number))

def byte_position(byte_position):
print('parsing with a byte position: {}'.format(byte_position))

def parse(**kwargs):
return globals()[next(iter(kwargs))](**kwargs)

parse(byte_position=29)
parse(line_number=29)

关于python - Python 中**kwargs 的正确使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52331595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com