python try/except/else 递归

python try/except/else with recursion

Python 版本:2.7。 OS: 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)

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

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

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

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/except/else,但有效?

如果我在递归调用中添加 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

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

我的第一个想法是,您看到的不一致行为可能是因为如果您 运行 一个接一个地安装某些目录,它们可能已经存在。为防止这种情况,请尝试将此代码添加到开头以清理由之前的 运行:

创建的任何目录
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)