1

私は独特の問題に直面しています。以下で簡単に説明します。このコードがあるとします-

class MyClass:

   __postBodies = []
    .
    .
    .
for the_file in os.listdir("/dir/path/to/file"):
      file_path = os.path.join(folder, the_file)
      params = self.__parseFileAsText(str(file_path)) #reads the file and gets some parsed data back
      dictData = {'file':str(file_path), 'body':params}
      self.__postBodies.append(dictData)
      print self.__postBodies
      dictData = None
      params = None

問題は、異なるファイルの params と dictData を毎回印刷すると、値が異なります (正しいことです) が、追加が発生するとすぐに __postBodies を印刷すると、奇妙なことが起こります。3 つのファイルがある場合、A、B、C と仮定すると、

初めて __postBodies に content = [{'body':{A dict with some data related to file A}, 'file':'path/of/A'}] がある

2 回目 = [{'body':{ファイル B に関連するデータを含む dict}, 'file':'path/of/A'}, {'body':{ファイルに関連するデータを含む dict} B}, 'ファイル':'path/of/B'}]

AND 3 回目 = [{'body':{A dict with some data related to file C}, 'file':'path/of/A'}, {'body':{A dict with some data related to file C}, 'file':'path/of/A'}, {'body':{A dict with some data related to file C} }, 'file':'path/of/B'}, {'body':{ファイル C に関連するデータを含む辞書}, 'file':'path/of/C'}]

したがって、「file」キーが非常にうまく機能していることがわかります。奇妙なことに、「body」キーは、最後に追加されたすべてのエントリで上書きされています。

私は間違いを犯していますか?何かしなければならないことはありますか?方向を教えてください。

よくわからない場合は申し訳ありません。

編集 - - - - - - - - - - - -

self.__parseFileAsText(str(file_path)) 呼び出しからの戻り値は、dictData に「本文」として挿入する辞書です。

EDIT2 ----------------------------

あなたが尋ねたように、これはコードですが、私は params = self.__parseFileAsText(str(file_path)) 呼び出しが毎回差分辞書を返すことを確認しました。

def __parseFileAsText(self, fileName):

        i = 0
        tempParam = StaticConfig.PASTE_PARAMS

        tempParam[StaticConfig.KEY_PASTE_PARAM_NAME] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = "text"
        tempParam[StaticConfig.KEY_PASTE_PARAM_EXPIREDATE] = "N"
        tempParam[StaticConfig.KEY_PASTE_PARAM_PRIVATE] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = ""
        tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = ""

        for line in fileinput.input([fileName]):
            temp = str(line)
            temp2 = temp.strip()
            if i == 0:              
                postValues = temp2.split("|||")

                if int(postValues[(len(postValues) - 1)]) == 0 or int(postValues[(len(postValues) - 1)]) == 2:
                    tempParam[StaticConfig.KEY_PASTE_PARAM_NAME] = str(postValues[0])

                    if str(postValues[1]) == '':                                        
                        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = 'text'
                    else:
                        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = postValues[1]

                    if str(postValues[2]) != "N":
                        tempParam[StaticConfig.KEY_PASTE_PARAM_EXPIREDATE] = str(postValues[2])

                    tempParam[StaticConfig.KEY_PASTE_PARAM_PRIVATE] = str(postValues[3])
                    tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = StaticConfig.API_USER_KEY
                    tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = StaticConfig.API_KEY

                else:
                    tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = StaticConfig.API_USER_KEY
                    tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = StaticConfig.API_KEY
                i = i+1
            else:
                if tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] != "" :           
                    tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = str(tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE])+"\n"+temp2
                else:
                    tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = temp2

        return tempParam
4

2 に答える 2

2

を呼び出すたびに同じ辞書を返す可能性が高く、MyClass.__parseFileAsText()これが発生する一般的な方法がいくつかあります。

  • __parseFileAsText()変更可能なデフォルト引数を受け入れます(最終的に返す辞書)
  • クラスまたはインスタンスの属性を変更し、毎回新しいものを作成する代わりにそれを返します

を呼び出すたびに新しい辞書を作成していることを確認すると、__parseFileAsText()この問題が解決するはずです。

編集:のコードを使用した更新された質問に基づいて、__parseFileAsText()問題は各呼び出しで同じ辞書を再利用していることです:

tempParam = StaticConfig.PASTE_PARAMS
...
return tempParam

変更している各呼び出しStaticConfig.PASTE_PARAMSで、最終結果は、リスト内のすべてのボディ ディクショナリが実際には への参照StaticConfig.PASTE_PARAMSです。内容に応じてStaticConfig.PASTE_PARAMS、一番上の行を次のいずれかに変更する必要があります。

# StaticConfig.PASTE_PARAMS is an empty dict
tempParam = {}

# All values in StaticConfig.PASTE_PARAMS are immutable
tempParam = dict(StaticConfig.PASTE_PARAMS)

のいずれかの値StaticConfig.PASTE_PARAMSが変更可能な場合は使用できますcopy.deepcopytempParam、これらのデフォルト値を独自に設定することをお勧めします。

于 2012-08-27T16:16:42.453 に答える
0

__postBodies現在定義されているようにクラス属性ではなく、単なるインスタンス属性だったとしたら?

于 2012-08-27T16:36:57.280 に答える