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

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: