在此示例代码中,我想在函数function db_properties
使用connect_and_query
上的变量。为此,我选择了return
。因此,使用该策略,代码可以完美运行。但是,在此示例中,db.properties文件只有4个变量。也就是说,如果属性文件有20多个变量,我应该继续使用return
吗?或者有最优雅/更清洁/正确的方法吗?
import psycopg2
import sys
from ConfigParser import SafeConfigParser
class Main:
def db_properties(self):
cfgFile='c:\test\db.properties'
parser = SafeConfigParser()
parser.read(cfgFile)
dbHost = parser.get('database','db_host')
dbName = parser.get('database','db_name')
dbUser = parser.get('database','db_login')
dbPass = parser.get('database','db_pass')
return dbHost,dbName,dbUser,dbPass
def connect_and_query(self):
try:
con = None
dbHost=self.db_properties()[0]
dbName=self.db_properties()[1]
dbUser=self.db_properties()[2]
dbPass=self.db_properties()[3]
con = None
qry=("select star from galaxy")
con = psycopg2.connect(host=dbHost,database=dbName, user=dbUser,
password=dbPass)
cur = con.cursor()
cur.execute(qry)
data = cur.fetchall()
for result in data:
qryResult = result[0]
print "the test result is : " +qryResult
except psycopg2.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)
finally:
if con:
con.close()
operation=Main()
operation.connect_and_query()
我正在使用python 2.7 此致
答案 0 :(得分:5)
如果有很多变量,或者想要轻松更改正在读取的变量,请返回字典。
def db_properties(self, *variables):
cfgFile='c:\test\db.properties'
parser = SafeConfigParser()
parser.read(cfgFile)
return {
variable: parser.get('database', variable) for variable in variables
}
def connect_and_query(self):
try:
con = None
config = self.db_properties(
'db_host',
'db_name',
'db_login',
'db_pass',
)
#or you can use:
# variables = ['db_host','db_name','db_login','db_pass','db_whatever','db_whatever2',...]
# config = self.db_properties(*variables)
#now you can use any variable like: config['db_host']
# ---rest of the function here---
编辑:我重构了代码,以便您可以在调用函数本身中指定要加载的变量。
答案 1 :(得分:4)
你当然不想4次致电db_properties()
;只需调用一次并存储结果。
返回dict而不是元组几乎肯定更好,因为调用者需要知道方法返回的顺序,而不是仅通过名称访问值。随着传递的值的数量增加,这变得更难维护。
e.g:
class Main:
def db_properties(self):
cfgFile='c:\test\db.properties'
parser = SafeConfigParser()
parser.read(cfgFile)
configDict= dict()
configDict['dbHost'] = parser.get('database','db_host')
configDict['dbName'] = parser.get('database','db_name')
configDict['dbUser'] = parser.get('database','db_login')
configDict['dbPass'] = parser.get('database','db_pass')
return configDict
def connect_and_query(self):
try:
con = None
conf = self.db_properties()
con = None
qry=("select star from galaxy")
con = psycopg2.connect(host=conf['dbHost'],database=conf['dbName'],
user=conf['dbUser'],
password=conf['dbPass'])
答案 2 :(得分:0)
注意:未经测试
您可以更改db_properties以返回dict:
from functools import partial
# call as db_properties('db_host', 'db_name'...)
def db_properties(self, *args):
parser = SafeConfigParser()
parser.read('config file')
getter = partial(parser.get, 'database')
return dict(zip(args, map(getter, args)))
但是否则最好将解析器保留为实例的属性,并提供一种方便的方法......
类什么(对象): def init (self,* args,** kwargs): # 等等等等等等 CFGFILE = 'C:\测试\ db.properties' self._parser = SafeConfigParser() self._parser.read(CFGFILE) @属性 def db_config(self,key): return self._parser.get('database',key)
然后使用con = psycopg2.connect(host=self.db_config('db_host')...)
答案 3 :(得分:0)
我建议你回复一个名字小组:
from collections import namedtuple
# in db_properties()
return namedtuple("dbconfig", "host name user password")(
parser.get('database','db_host'),
parser.get('database','db_name'),
parser.get('database','db_login'),
parser.get('database','db_pass'),
)
现在您有一个可以通过索引或属性访问的对象。
config = self.db_properties()
print config[0] # db_host
print config.host # same