python try/except/else 递归

use*_*855 1 python recursion try-except

Python 版本:2.7。操作系统:Windows 10 64 位。

注意:我找到了一种解决下面描述的问题的方法,该方法不使用 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)
Run Code Online (Sandbox Code Playgroud)

现在我转到 Powershell,然后键入:

import blah
myStr = blah.makeFolder('myFolder')
print myStr
print type(myStr)
Run Code Online (Sandbox Code Playgroud)

它做我所期望的 - 创建了一个名为 myFolder_0 的文件夹,并打印myFolder_0<type 'str'>. 现在,仍然在 Powershell 中,我输入:

myStr1 = blah.makeFolder('myFolder')
print myStr1
print type(myStr1)
Run Code Online (Sandbox Code Playgroud)

这次它创建了一个名为 myFolder_1 的文件夹,正如我所期望的,但它不是打印myFolder_1and <type 'str'>,而是打印Noneand <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)
Run Code Online (Sandbox Code Playgroud)

然后在Powershell中:

python blah2.py
Run Code Online (Sandbox Code Playgroud)

这次它生成 myFolder_0 并打印myFolder_0and <type 'str'>, (所以myStr块像在 中一样工作blah.py),然后进入无限递归(所以myStr1块不起作用)。因此,出于我不明白的原因,行为与交互式会话期间的行为不同。如果我python blah2.py再次输入,它会生成 myFolder_1 并打印None<type 'NoneType'>myStr块),然后再次进入无限递归(myStr1块)。

为什么脚本的行为与交互式会话不同,为什么脚本中会发生无限递归,是否有我的代码版本仍然使用 try/except/else,但有效?

use*_*559 5

如果我将 a 添加return到递归调用中,您的代码对我来说很好用:

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
Run Code Online (Sandbox Code Playgroud)

至于为什么你会看到你所看到的......这里肯定有其他事情发生。您共享的代码blah2.py不可能工作,因为blah没有在任何地方定义。我的猜测是您在没有意识到的情况下运行了不同的代码。(也许是不同目录中文件的不同副本?)