如果变量不是None,则将key:value添加到字典中



我有一个函数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

最新更新