Python 2.7:在多个函数中从同一个字典中提取值

时间:2016-08-10 09:58:44

标签: python python-2.7 dictionary

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

例如,

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

解决这个问题的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

代码可以缩小很多:

'username' in mas_details.keys():

keys()是多余的,它等于

'username' in mas_details

但更重要的是,

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

答案 1 :(得分:0)

好吧,如果您只需要函数中的所有6个变量,就可以破坏字典,即

**kwargs

这将使您无需从字典中进行显式提取即可访问变量。其中一个好的做法是保持参数数量有限,因此请考虑使用默认值初始化dict一次,然后使用# 1. Initialize dictionary # 2. Fill default values # 3. Use with kwargs: def f(**kwargs): arg1 = kwargs['arg1'] # at this point you are SURE, that there is a value 并手动提取所需的值,以防数字争论的增长。

<tr class="table-success"></tr>
<tr class="table-error"></tr>
<tr class="table-warning"></tr>
<tr class="table-info"></tr>
<tr class="table-danger"></tr>