Python 这两个规范的等效代码

Python code equivalent for these two specifications

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

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

我把这个翻译成...

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

我问我已经说过了;术语很奇怪;例如 "contents of the exception being the filename"。

另外,另一个规范是如果参数filename不是字符串类型,则抛出TypeError异常,异常内容为字符串"parameter filename is not a string".

同样,"contents of the exception"?

我对该规范的翻译是...

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

首先,我们在 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__ 给出了异常的名称 class,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 is a path-like object giving the pathname (absolute or relative to the current working directory) of the file to be opened or an integer file descriptor of the file to be wrapped.

下面的例子是

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