3

フルスクリプト:https ://gist.github.com/4476526

問題の特定のコードは

# Cloud Files username & API key
username = ''
key = ''

# Source and destination container names
originContainerName = ''
targetContainerName = ''

...

def cloudConnect():
    global originContainer
    global targetContainer
    global connection
    print "Creating connection"
    connection = cloudfiles.get_connection(username,key,servicenet=True)
    print "-- [DONE]"
    print "Accessing containers"
    originContainer = connection.create_container(originContainerName)
    targetContainer = connection.create_container(targetContainerName)
    print "-- [DONE]"
    return

スクリプトは完全に正常に機能しますが、グローバル変数はためらうことなく使用する必要があり、ほとんどの場合、グローバル変数なしで同じことを行うためのより良い方法があることを複数の場所で読みました。これは本当ですか?もしそうなら、このスクリプトをどのように正確に修正する必要がありますか?私には、これらのオブジェクトを複数の関数の引数として渡すのではなく、グローバル接続変数とコンテナー変数を使用する方がはるかに簡単に思えます。

4

2 に答える 2

5

CloudContainerこれらのグローバル変数をすべてメンバーとして含むクラス(のようなものと呼ばれる)を作成し、それを(開始点として)次のように書き直す必要があります。

class CloudContainers(object):
    def __init__(self, username, key, originContainerName, targetContainerName):
        self.username = username
        self.key = key     
        self.originContainerName = originContainerName
        self.targetContainerName = targetContainerName

    def cloudConnect(self):
        print "Creating connection"
        self.connection = cloudfiles.get_connection(self.username,self.key,servicenet=True)
        print "-- [DONE]"
        print "Accessing containers"
        self.originContainer = connection.create_container(self.originContainerName)
        self.targetContainer = connection.create_container(self.targetContainerName)
        print "-- [DONE]"
        return

    def uploadImg(self, new_name):
        new_obj = self.targetContainer.create_object(new_name)
        new_obj.content_type = 'image/jpeg'
        new_obj.load_from_filename("up/"+new_name)

    def getImg(name):
        obj = self.originContainer.get_object(name)
        obj.save_to_filename("down/"+name)

したがって、これらのグローバル変数(上記など)を使用する関数はすべてgetImguploadImgクラスのメソッドとして含まれます。

于 2013-01-07T17:26:31.490 に答える
1

簡単ですが、それは、これらの変数がいつ、なぜ変更されるのかを判断するのが非常に難しいことを意味します。最良の答えはあなたがあなたの質問で与えたものだと思います-それらをオブジェクトとして回してください。例えば:

def cloud_connect(origin_container_name, target_container_name):
    print "Creating connection"
    connection = cloudfiles.get_connection(username, key, servicenet=True)
    print "-- [DONE]"
    print "Accessing containers"
    origin_container = connection.create_container(origin_container_name)
    target_container = connection.create_container(target_container_name)
    print "-- [DONE]"
    return connection, origin_container, target_container

次に、そのタプルを渡すだけです。

于 2013-01-07T17:26:23.050 に答える