Python版本:2.7。操作系统:Windows 10 64位。python try/except/else递归
注意:我找到了一个解决下面描述的问题的方法,它不使用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'>
。现在,仍然在PowerShell中,I型:
myStr1 = blah.makeFolder('myFolder')
print myStr1
print type(myStr1)
这一次,它使一个被称为myFolder_1文件夹,如我所料,但不是打印myFolder_1
和<type 'str'>
,它打印None
和<type 'NoneType'>
。在接下来的每一次我使用blah.makeFolder('myFolder')
时,它都会继续这样做。
如果我将在Powershell中输入的命令放入脚本中,行为也会有些奇怪。我做了一个叫blah2.py
文件,该文件是一样的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)
myStr = makeFolder('myFolder')
print myStr
print type(myStr)
myStr1 = makeFolder('myFolder')
print myStr1
print type(myStr1)
然后在PowerShell中:
python blah2.py
这一次,它使得myFolder_0并打印myFolder_0
和<type 'str'>
,(因此myStr
块的工作原理与blah.py
一样),然后进入无限递归(因此myStr1
块不起作用)。所以出于我不明白的原因,这种行为与交互式会话中的行为不同。如果我再次键入python blah2.py
,它使myFolder_1并打印None
和<type 'NoneType'>
(myStr
块),然后进入无限递归再次(myStr1
块)。
为什么脚本行为不同于互动环节中,为什么无限递归的脚本发生,是有我的代码版本仍然使用try /除/人,但工作?
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
至于为什么你看到的,你看到的......肯定有别的东西怎么回事:如果我添加一个return
的递归调用
欢迎的StackOverflow!我只想赞扬你提出一个很好的问题,包括一个很好的小例子。做得好! –
“Powershell”与这里有什么关系?你是否打错了“Python shell”或者你是否真的在使用PowerShell? – smarx
'blah2.py'对我来说看起来不正确......它执行'blah.makeFolder',但'blah'没有在任何地方定义? – smarx