1

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()

私はPython2.7を使用していますよろしく

4

4 に答える 4

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

編集:呼び出し元の関数自体にロードする変数を指定できるように、コードをリファクタリングしました。

于 2012-10-04T15:26:12.540 に答える
4

db_properties()確かに4 回呼び出す必要はありません。一度呼び出して結果を保存するだけです。

また、タプルではなく dict を返す方がほぼ確実に優れています。これは、名前で値にアクセスするだけでなく、呼び出し元がメソッドが返すものを順番に知る必要があるためです。渡される値の数が増えると、これを維持するのがさらに難しくなります。

例えば:

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'])
于 2012-10-04T15:24:58.857 に答える
0

namedtuple を返すことをお勧めします:

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
于 2012-10-04T16:43:33.617 に答える
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)))

それ以外の場合は、パーサーをインスタンスの属性として保持し、便利なメソッドを提供するのがおそらく最善です...

class what(object): def init (self, *args, **kwargs): # 何とか何とか cfgFile='c:\test\db.properties' self._parser = SafeConfigParser() self._parser.read(cfgFile) @property def db_config(self, key): return self._parser.get('database', key)

次に使用しますcon = psycopg2.connect(host=self.db_config('db_host')...)

于 2012-10-04T15:56:17.577 に答える