bon*_*tit 5 python dictionary if-statement python-3.x nonetype
我有一个函数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
Run Code Online (Sandbox Code Playgroud)
我认为这不是最优的解决方案,因为代码量很大,可读性很差,我该如何改进该代码?我有一个想法(但我不知道如何实现):
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
Run Code Online (Sandbox Code Playgroud)
小智 2
您可能会重新考虑您的策略。
最好有一个对于某些键值为 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))
Run Code Online (Sandbox Code Playgroud)
这样你就有了一个一致的字典。您稍后必须检查某些值是否为“无”。
创建一个缺少键的字典将迫使您检查它们将来是否存在,而不是您可以只检查它们是否为 None
所以而不是做
if "location" in myDict.Keys():
你只要做
if myDict["location"] is not None: