我有一本将要传递给多个函数的字典。在每个函数中,我需要提取字典的所有值。
例如,
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
。
解决这个问题的最佳方式是什么?
答案 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>