2

モジュールから変数を公開する最良の方法は何ですか?

import otherDBInterface as odbi

def create(host):
    global connection
    global cursor
    connection = odbi.connect(host)
    cursor = connection.cursor()
    ...

cursorのようなことができるように、モジュール内の変数を公開したいと思いmydb.cursor.execute("select * from foo;")ます。キーワードを使用するglobalとこれができると思いましたが、そのような運はありません。 cursorはオブジェクトであるため、公開するためにどのように宣言するかわかりません。

4

2 に答える 2

5

接続情報をクラスにラップできます

class Database:

    def __init__(self, **kwargs):

        if kwargs.get("connection") is not None:

            self.connection = kwargs["connection"]

        elif kwargs.get("host") is not None:

            self.connection = odbi.connect(host)
            self.cursor = self.connection.cursor()

mydb = Database(host="localhost")

results = mydb.cursor.execute("select * from foo")

#or use it with a connection

mydb = Database(connection="localhost")

results = mydb.cursor.execute("select * from foo")
于 2013-06-28T03:48:24.050 に答える
2

モジュール レベルで作成された変数は、デフォルトで「公開」されます。

したがって、このようなモジュールには 3 つの公開変数があります。

configpath = '$HOME/.config'

class Configuration(object):

    def __init__(self, configpath):
        self.configfile = open(configpath, 'rb')

config = Configuration(configpath)

変数はconfigpathConfigurationおよびconfigです。これらはすべて、他のモジュールからインポート可能です。としてconfigsにアクセスすることもできます。configfileconfig.configfile

次の方法で configfile をグローバルにアクセス可能にすることもできます。

configpath = '$HOME/.config'
configfile = None

class Configuration(object):

    def __init__(self, configpath):
        global configfile
        configfile = open(configpath, 'rb')

config = Configuration(configpath)

しかし、これにはさまざまなトリッキーな問題があります。たとえば、configfile別のモジュールからハンドルを取得した場合Configuration、元のハンドル内から置き換えられても変更されません。したがって、これは変更可能なオブジェクトでのみ機能します。

上記の例ではconfigfile、この方法でグローバルとして使用してもあまり役に立たないことを意味します。ただし、configそのように使用するとうまくいく可能性があります。

于 2013-06-29T12:55:46.640 に答える