Python 使用从函数A到函数B的变量
在这个示例代码中,我想使用函数Python 使用从函数A到函数B的变量,python,python-2.7,Python,Python 2.7,在这个示例代码中,我想使用函数connect\u和\u query中的函数db\u属性上的变量。要实现这一点,我选择返回。因此,使用这种策略,代码可以完美地工作。但是,在本例中,db.properties文件只有4个变量。也就是说,如果属性文件有20多个变量,我是否应该继续使用return?或者有没有最优雅/干净/正确的方法 import psycopg2 import sys from ConfigParser import SafeConfigParser class Main:
connect\u和\u query
中的函数db\u属性上的变量。要实现这一点,我选择返回。因此,使用这种策略,代码可以完美地工作。但是,在本例中,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()
我正在使用Python2.7
关于您当然不想调用db\u properties()
4次;只需调用一次并存储结果
几乎可以肯定,返回dict比返回tuple更好,因为调用方需要知道方法按顺序返回什么,而不仅仅是通过名称访问值。随着传递的值数量的增加,这就更难维护了
e、 g:
您当然不想调用db\u properties()
4次;只需调用一次并存储结果
几乎可以肯定,返回dict比返回tuple更好,因为调用方需要知道方法按顺序返回什么,而不仅仅是通过名称访问值。随着传递的值数量的增加,这就更难维护了
e、 g:
如果有很多变量,或者如果您想轻松更改正在读取的变量,请返回字典
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---
编辑:我重构了代码,因此您可以指定要在调用函数本身中加载的变量。如果有很多变量,或者您想轻松更改正在读取的变量,请返回字典
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---
编辑:我重构了代码,因此您可以指定要在调用函数本身中加载的变量。NB:untested
您可以更改db_属性以返回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)))
但除此之外,最好将解析器作为实例的属性,并提供一种方便的方法
类(对象):
definit(self,*args,**kwargs):
#废话废话
cfgFile='c:\test\db.properties'
self.\u parser=SafeConfigParser()
self.\u parser.read(cfgFile)
@财产
def db_配置(自身,钥匙):
返回self.\u parser.get('database',key)
然后使用con=psycopg2.connect(host=self.db\u config('db\u host')…)
NB:untested
您可以更改db_属性以返回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)))
但除此之外,最好将解析器作为实例的属性,并提供一种方便的方法
类(对象):
definit(self,*args,**kwargs):
#废话废话
cfgFile='c:\test\db.properties'
self.\u parser=SafeConfigParser()
self.\u parser.read(cfgFile)
@财产
def db_配置(自身,钥匙):
返回self.\u parser.get('database',key)
然后使用
con=psycopg2.connect(host=self.db\u config('db\u host')…)
我建议返回一个命名的元组:
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
我建议返回一个命名的整数:
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
你能给我一个例子说明我是如何做到的吗?你能给我一个例子说明我是如何做到的吗?+1,但请注意,字典理解在Python中不起作用,事实上,无论何时编写字典理解,都要记住这一点。感谢您指出:)@AnujGupta我尝试了您的解决方案,但收到了错误:“TypeError:get()至少需要3个参数(给定2个)还需要将
'database'
传递给解析器。get()
,仅此而已:)我已更新了代码。是的,但此修订版是对您的确切问题的直接回答。如果您愿意,您可以修改您的问题以包括多节问题,我将此移回修订版8.+1,但请注意,词典理解在Python中不起作用,实际上,无论何时编写,都要记住这一点感谢您指出:)@AnujGupta我尝试了您的解决方案,但收到了错误:“TypeError:get()至少需要3个参数(2个给定参数)还需要将'database'
传递给解析器。get()
,仅此而已:)我已更新了代码。是的,但此修订版是对您确切问题的直接回答。如果你愿意,你可以修改你的问题,把多部分的问题包括在内,我会把它移回第8版。