2016-08-20 14 views
1

Pythonバージョン:2.7。 OS:Windows 10 64ビット。python try/except/else with recursion

注:try/except/elseステートメントを使用しない以下の問題を回避する方法を見つけました。私は、以下の質問は、なぜコードがそれがどういうふうに振る舞うのか、try/except/elseを使って何をしようとしているのかが不思議だからです。

私は、次のコードを使用して、ファイルがblah.pyと呼ばれる持っている:

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

は、今私はPowerShellのに行き、タイプ:

import blah 
myStr = blah.makeFolder('myFolder') 
print myStr 
print type(myStr) 

それは私が期待する何を - myFolder_0というフォルダをが作成され、myFolder_0<type 'str'>が印刷されます。

myStr1 = blah.makeFolder('myFolder') 
print myStr1 
print type(myStr1) 

私は期待通りに、myFolder_1というフォルダを作る。この時間は、代わりにmyFolder_1<type 'str'>を印刷するのではなく、None<type 'NoneType'>出力します。さて、まだPowerShellでは、私はと入力します。それ以降の私はblah.makeFolder('myFolder')を使用するたびにこれを続けます。

私はPowershellで入力したコマンドをスクリプトの中に入れても、動作が変わってしまいます。私はblah.pyと同じであるblah2.pyと呼ばれるファイルを、作ったが、最後にスクリプトを使って:PowerShellでは次に

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

myStr = makeFolder('myFolder') 
print myStr 
print type(myStr) 

myStr1 = makeFolder('myFolder') 
print myStr1 
print type(myStr1) 

python blah2.py 

それはmyFolder_0と版画myFolder_0<type 'str'>になります。この時(したがって、myStrブロックはblah.pyのように動作します)、無限回帰に入ります(したがって、myStr1ブロックは機能しません)。ですから私が理解していない理由のために、対話セッション中の動作とは異なります。再度python blah2.pyと入力すると、myFolder_1となり、None<type 'NoneType'>myStrブロック)が印刷され、再び無限再帰(myStr1ブロック)に入ります。

なぜスクリプトは対話型セッションとは異なった振る舞いをしますが、なぜスクリプト内で無限再帰が起こるのですか?try/except/elseを使用するコードがありますが、動作しますか?私は再帰呼び出しにreturnを追加する場合

+0

はStackOverflowのへようこそ!素晴らしいコンパクトな例を含め、すばらしい質問をすることであなたを推薦したいと思います。よくやった! –

+1

"Powershell"はここでどのように関連していますか?あなたは単に "Pythonシェル"を入力しましたか、どういうわけか実際にPowerShellを使用していますか? – smarx

+1

'blah2.py'は私には見えません...' blah.makeFolder'を実行しますが、 'blah'はどこにも定義されていませんか? – smarx

答えて

3

あなたのコードは私のために正常に動作します:あなたが見ているものを見ている理由として

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) 
    except OSError: 
     return makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

print(makeFolder('myFolder')) # myFolder_0 
print(makeFolder('myFolder')) # myFolder_1 

...ここで起こって何か他のものは間違いなくあります。 blahはどこにも定義されていないため、blah2.pyで共有したコードは機能しませんでした。私の推測では、それを実現せずに異なるコードを実行しているということです。 (別のディレクトリにあるファイルの別のコピーかもしれません)

+0

私にそれを打つ:)、彼はまた、可能なすべての例外をトラップする以外は、OSError'である適切な例外を処理する必要があります – danidee

+0

素晴らしい、これは、ありがとう! 2つのことについて:まず、元の投稿には誤植がありました。私のblah2.pyファイルにはblah.makeFolderはなく、単にmakeFolderがありませんでした。私は瞬時に編集します。次に、コンピュータを再起動してもう一度やり直してから、インタラクティブなセッションと同じことをやり始めたので、メモリに奇妙なものがあったと思います。 – user3558855

0

私が最初に考えているのは、あるディレクトリが次々に実行されている場合に存在するためです。これを防ぐために、前回の実行によって作成されたディレクトリをクリーンアップするために先頭にこのコードを追加してみてください:

import os 

for dirname in [f for f in os.listdir('.') if 
       (os.path.isdir(f) and f.startswith('myFolder'))]: 
    os.rmdir(dirname) 

しかし、ここでは、実際の問題を解決する方法は次のとおりです。

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     return makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num)