Эквивалент кода Python для этих двух спецификаций - PullRequest
1 голос
/ 08 мая 2019

Не удается перевести следующие две спецификации в код Python. Я считаю, что терминология странная для программы на Python (throw, catch, содержимое исключения).

Первая спецификация гласит: «Если файл не может быть открыт, потому что он не существует, вы должны перехватить объект 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')

1 Ответ

0 голосов
/ 08 мая 2019

Для начала, мы делаем except Exception: в python, вместо 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

файл - это объект, похожий на путь, задающий путь (абсолютный или относительный к текущему рабочему каталогу) открываемого файла или целочисленный файловый дескриптор файла, который нужно обернуть.

Примером ниже является

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

...