我有一个函数clans()
,它接受8个参数。若参数不是None
,我需要将键值对添加到字典中。这是我的解决方案:
def clans(self, name: str = None, warFrequency: str = None, location: str = None,
minMembers: int = None, maxMembers: int = None,
minClanPoints: int = None, minClanLevel: int = None,
labels: list[str] = None):
params = {} # <- the dictionary to add to
# very much if-conditions
if name is not None:
params['name'] = name
if warFrequency is not None:
params['warFrequency'] = warFrequency
... # <- other function arguments and if conditions
if labels is not None:
params['labels'] = labels
return params
我认为这不是最理想的解决方案,因为代码量大,可读性差,我该如何改进代码?我有一个想法(但我不知道如何实现(:
params = {}
for arg in args: # <- args is list of function arguments
if arg is not None:
params[arg.key()] = arg.value() # <- arg.key() is argument name, arg.value() is value
您可能会重新考虑您的策略。
对于某些键,最好有一个值为None的字典,而不是一些键可能不存在的不一致字典。
因此,如果您允许调用带有一些缺失信息的函数族,只需创建该键并指定一个none值即可。这很好,因为也许你现在还没有这些信息。
稍后,您可以拥有一个更新这些值的函数,因此您只需重新分配一个已经存在的字典键,就不必担心这些键不存在。
所以,我会做一些类似的事情:
def clans(self, name: str = None, warFrequency: str = None, location: str = None,
minMembers: int = None, maxMembers: int = None,
minClanPoints: int = None, minClanLevel: int = None,
labels: list[str] = None):
myKeys = ["name", "warFrequency", "location", "minMembers", "maxMembers", "minClanPoints", "minClanLevel"]
myValues = [name, warFrequency, location, minMembers, maxMembers, minClanPoints, minClanLevel]
return dict(zip(myKeys, myValues))
这样你就有了一本连贯的字典。您稍后必须检查某些值是否为"无"。
创建一个缺少关键字的字典会迫使你检查它们在未来是否存在,而不是你可以只检查它们是否为None
所以与其做
if "location" in myDict.Keys():
你只需要做
if myDict["location"] is not None:
我已经找到了一个答案,基于@RJ Adriaansen解决方案,它就在那里(这也会检查参数是否不是self
(:
def clans(self, name: str = None, warFrequency: str = None, location: str = None,
minMembers: int = None, maxMembers: int = None,
minClanPoints: int = None, minClanLevel: int = None,
labels: list[str] = None):
params = {k: v for k, v in locals().items() if v is not None and v != self}
# ^^^^^^^^^^^^^
# small change
return params