【问题标题】:Python code equivalent for these two specifications这两个规范等效的 Python 代码
【发布时间】:2019-05-08 08:35:04
【问题描述】:

无法将以下两个规范转换为 Python 代码。我发现 Python 程序的术语很奇怪(抛出、捕获、异常内容)。

第一个规范声明“如果文件不存在而无法打开,则必须捕获 FileNotFoundError 对象并抛出一个新的异常 FileNotFoundError,异常的内容是文件名。任何其他打开失败的异常没有被捕获。文件名被发送到函数中。

我把它翻译成……

try:
    f = open(filename)
except FileNotFoundError(filename):
    raise FileNotFoundError(filename)

我已经说过了;术语很奇怪;例如“异常的内容是文件名”。

另外,另一个规范是,如果参数文件名不是字符串类型,则抛出 TypeError 异常,异常内容是字符串“参数文件名不是字符串”。

再次,“异常的内容”?

我对该规范的翻译是……

x = isinstance(filename, (str))
if x == False:
    raise TypeError('parameter filename is not a string')

【问题讨论】:

    标签: python try-catch throw raise isinstance


    【解决方案1】:

    首先,我们在 python 中使用except Exception:,而不是您使用的except FileNotFoundError(filename):

    是的,一种思路是,如果open找不到文件,就会抛出FileNotFoundError,我们只要捕获一个一般异常并打印就可以看到。

    filename = 'abcd'
    try:
        f = open(filename)
    except Exception as e:
        print('{} {}'.format( e.__class__.__name__, e))
    

    这会给

    FileNotFoundError [Errno 2] No such file or directory: 'abcd'
    

    e.__class__.__name__ 给出了异常类的名称,e 给出了字符串描述

    现在做你正在做的事情的正确方法是

    filename = 'abcd'
    try:
        f = open(filename)
    except FileNotFoundError:
        raise FileNotFoundError(filename)
    

    这意味着当open抛出FileNotFoundError时,捕获该特定异常,并在通过FileNotFoundError(filename)修改异常字符串后重新抛出它,这里我们将异常字符串修改为filename

    为了看看现在发生了什么,我们这样调用这个函数

    def func():
    
        filename = 'abcd'
        try:
            f = open(filename)
        except FileNotFoundError:
            raise FileNotFoundError(filename)
    
    try:
        func()
    except Exception as e:
        print('{} {}'.format(e.__class__.__name__, e))
    

    这将输出FileNotFoundError abcd。我们在这里看到异常字符串或您调用它的内容,文件名在这里被打印为异常字符串。

    下面还有你的假设

    x = isinstance(filename, (str))
    if x == False:
        raise TypeError('parameter filename is not a string')
    

    有点正确,文件名不仅包括字符串,还包括我们在文档中看到的整数:https://docs.python.org/3/library/functions.html#open

    file 是一个类似路径的对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符。

    下面的一个例子是

    filename = 1.45
    try:
        f = open(filename)
    except Exception as e:
        print('{} {}'.format( e.__class__.__name__, e))
    

    输出是TypeError integer argument expected, got float,因为它试图将float转换为int,认为它是一个文件描述符,但它得到了一个float

    【讨论】:

    • 它需要整数。有趣的。很好的回应。
    • 太棒了!很高兴帮助@Grog!如果答案对您有帮助,请考虑通过单击旁边的勾来接受它:) 也请考虑查看stackoverflow.com/help/someone-answers :)
    • 完成。另外,你只能在使用 Python 时将字符串写入文件吗?我尝试使用 Python 将整数写入文件,结果出现 TypeError。
    • 你是如何写入文件的?
    • 打开要写入的文件后; “f.write(5)”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多