Эквивалент кода Python для этих двух спецификаций

Возникли проблемы с переводом следующих двух спецификаций в код 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')

person Grog    schedule 08.05.2019    source источник


Ответы (1)


Для начала делаем 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

person Devesh Kumar Singh    schedule 08.05.2019
comment
Он принимает целые числа. Интересно. Хороший ответ. - person Grog; 08.05.2019
comment
Большой! Рад помочь @Grog! Если ответ помог вам, подумайте о том, чтобы принять его, щелкнув галочку рядом с ним :) Также обратите внимание на stackoverflow.com/ помощь/кто-то-ответы :) - person Devesh Kumar Singh; 08.05.2019
comment
Сделанный. Кроме того, вы можете записывать строки в файлы только при использовании Python? Я попытался записать целое число в файл с помощью Python, и он выдал TypeError. - person Grog; 08.05.2019
comment
как ты пишешь в файл? - person Devesh Kumar Singh; 08.05.2019
comment
После открытия файла для записи; f.написать(5). - person Grog; 08.05.2019
comment
Ааа, запись принимает только строковые аргументы, вам нужно преобразовать ее в строку! @Грог - person Devesh Kumar Singh; 08.05.2019
comment
Хорошо знать. Я заметил, что readline() и readlines() будут читать строку и список строк соответственно (независимо от того, какой тип был в исходном файле). Имеет смысл писать только строки для этого метода. - person Grog; 08.05.2019
comment
Отлично :) @Grog Рад помочь! - person Devesh Kumar Singh; 08.05.2019