Python2.7:在多个函数中从同一字典中提取值

2024-06-16 10:52:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,它将传递给多个函数。在每个函数中,我需要提取字典的所有值。在

例如

def foo(mas_details):
    # Extract mas details
    if 'ip' in mas_details.keys():
        mas_ip = mas_details['ip']
    else:
        logger_object.critical("MAS IP not provided!")
        return False
    if 'username' in mas_details.keys():
        mas_username = mas_details['username']
    else:
        mas_username = 'root'
    if 'password' in mas_details.keys():
        mas_password = mas_details['password']
    else:
        mas_password = 'root'
    if 'protocol' in mas_details.keys():
        mas_protocol = mas_details['protocol']
    else:
        mas_protocol = "http"
    if 'timeout' in mas_details.keys():
        mas_timeout = mas_details['timeout']
    else:
        mas_timeout = 120

我有大约15个函数,我将传递这个mas_details字典。但是,提取每个函数中的值会使代码重复。在

我想把值的提取放入函数本身。但是,如果我这样做,变量将无法在父函数中访问,除非我使所有变量global。在

最好的办法是什么?在


Tags: 函数inipif字典deftimeoutusername
2条回答

代码可以缩小很多:

'username' in mas_details.keys():

keys()是多余的,它等于

^{pr2}$

但更重要的是

if 'username' in mas_details.keys():
    mas_username = mas_details['username']
else:
    mas_username = 'root'

等于

mas_username = mas_details.get('username', 'root')

如果键不存在,get函数将使用默认值。在

但是:你所拥有的是一些变量组和一些总是作用于变量的功能。这就是我们发明类的原因:

class MasDetails(object):
    def __init__(self, mas_details):
        self.username = mas_details.get('username', 'root')
        self.password = mas_details.get('password', 'root')

等等。然后传入一个MasDetails实例并使用它的.username属性。在

mas = MasDetails(mas_details)

def foo(mas):
    # use mas.username, mas.password here

如果您有任何只使用这些属性的功能,请将其作为方法放在这个类中。在

特别是,也许你的foo函数和其他14个函数应该只是MasDetails类上的方法,然后它们就可以使用self.username。在

如果你只需要一个函数中的所有6个变量,你可以破坏字典,也就是说

def f1(arg1, arg2, ..., arg6):
   ...

def f2(arg1, arg2, ..., arg6):
   ...

# initialize dictionary
d = {'arg1': 'val1', 'arg2': 'val2', ...}

# fill default values (or use defaultdict with appropriate factory)
d['arg1'] = d.get('arg1', 'default_arg1_value')
d['arg2'] = d.get('arg2', 'default_arg2_value')
...

f1(**d)
f2(**d)
...

这将使您可以访问变量,而无需从字典中显式提取。一个好的做法是限制参数的数量,因此考虑用默认值初始化dict一次,然后使用**kwargs并手动提取所需的值,以防参数数量增加。在

^{pr2}$

相关问题 更多 >