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
を追加する場合
はStackOverflowのへようこそ!素晴らしいコンパクトな例を含め、すばらしい質問をすることであなたを推薦したいと思います。よくやった! –
"Powershell"はここでどのように関連していますか?あなたは単に "Pythonシェル"を入力しましたか、どういうわけか実際にPowerShellを使用していますか? – smarx
'blah2.py'は私には見えません...' blah.makeFolder'を実行しますが、 'blah'はどこにも定義されていませんか? – smarx