0

OK、私はPerlからPythonに移行していますが、Pythonの経験があまりないので、Pythonの経験が豊富な人なら誰でもこれは明らかなように思えるかもしれません。

とにかく、私は単に構成ファイルをロードしてから、セルフテストとして、ロードされた値を出力しています。コードは以下のとおりです。

#!/home/y/bin/python2.7
import logging
import sys
import datetime
import yaml

def main(self):
    #initialize the logger
    logger = logging.getLogger(self.granularity)
    log_fh = logging.FileHandler(filename='/home/logs/pipelineTest/pipelineTest' + datetime.datetime.now().strftime('%Y%m%d_%H%M')  + '.log', mode='w')
    logger.addHandler(log_fh)
    logger.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)-6s: %(name)s - %(levelname)s - %(message)s')
    log_fh.setFormatter(formatter)

    #read configuration file
    if sys.argv[1]:
        ymlFH = open(sys.argv[1])
    else:
        ymFH = open('/home/conf/pipelineTest/runPipeline.yml')

    confDict = yaml.load(ymlFH)

if __name__ == '__main__':
    #self-test code
    for key, value in confDict.iteritems():
      print 'Key is: ' + key + '\n'
      print 'value is: ' + confDict[key] + '\n'

私が遭遇しているエラーは次のとおりです。

Traceback (most recent call last):
  File "./runPipeline.py", line 30, in <module>
    for key, value in confDict.iteritems():
NameError: name 'confDict' is not defined

私が「confDict」という名前として解釈しているものは、範囲外になっています。なぜ範囲外になったのかわかりません。

4

4 に答える 4

6

main()関数には独自のスコープがあります。それだけでなく、関数を呼び出すこともありません。

confDict関数から戻って、実行中のブロックで実行することをお勧めします。または、関数を複数の場所でconfDict = main()使用する予定がない場合は、関数をまっすぐに置いて、関数を気にしないでください。main()

于 2012-06-18T22:05:56.930 に答える
4

変数confDictは関数内で定義されているmain()ため、その関数に対してローカルです。(ちなみに、電話すらしませんmain()。)

おそらく、forループをスクリプトの最後から関数の最後に移動し、代わりにスクリプトの最後でmain()呼び出します。main()

于 2012-06-18T22:05:59.353 に答える
0

それは範囲外ではなく、範囲内に入るconfDictことがありませんでした。

import ...

def main(self):
    ...

if __name__ == '__main__':
    #self-test code
    for key, value in confDict.iteritems():
      print 'Key is: ' + key + '\n'
      print 'value is: ' + confDict[key] + '\n'

その時点でif __name__ == ...、一連の名前をインポートし、と呼ばれる関数を定義しましたmain。変数condDictが定義されたことはありません。condDictに何が入力されているかに関係なく、...類似のコードが定義する言語はわかりませんmain

呼び出すと main、。という変数が作成されconfDictます。ただし、その名前はその特定の呼び出しに対してローカルであるmainため、関数の外部で意味のある形で使用することはできません(想像してみてください。main何度も呼び出され、多くの値を生成できます。これは、外部confDictを参照するときに意味します。?)。confDictmain

いくつかのPythonチュートリアルを実行することをお勧めします。プログラミング全般(つまりPerl)に既に精通している場合は、それらに目を通しますが、コーディングに集中できるように、これらの基本的な問題をすべて明確にします。


余談ですが、selfへの議論mainは意味がありません。それを削除して持っているか、それらを内部から引き出す代わりにdef main():使用します(私の好みは後者です)。def main(args)sys.argvmain

于 2012-06-19T01:38:38.613 に答える
0

confDictはmainに対してローカルであり、Pythonでは、関数の定義はインデントに依存します。したがって、mainがすでに終了しているため、ifステートメント内で関数スコープにアクセスしようとすると、関数スコープは終了します。(インデントを参照)

于 2012-06-18T22:08:09.960 に答える