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版。