Открыть файлы в режиме "рок-н-ролл"

Мне интересно, что происходит с проверкой режима файла open() (Python2.7):

>>> with open('input.txt', 'illegal') as f:
...     for line in f:
...         print line
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'illegal'

>>> with open('input.txt', 'rock&roll') as f:
...     for line in f:
...         print line
... 
1

2

3

Итак, я не могу открыть файл в режиме illegal, но я могу открыть его в режиме rock&roll. Какой режим фактически используется для открытия файла в этом случае?

Обратите внимание, что на python3 я не могу использовать оба illegal и rock&roll:

>>> with open('input.txt', 'rock&roll') as f:
...     for line in f:
...         print(line)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid mode: 'rock&roll'
>>> with open('input.txt', 'illegal') as f:
...     for line in f:
...         print(line)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid mode: 'illegal'

И это запутанно, почему поведение отличается от python3.x?

Ответы

Ответ 1

Функция Python 2.x open по существу делегирует свою работу функции C library fopen. В моей системе документация для fopen содержит:

Аргумент mode указывает на строку, начинающуюся с одной из следующих последовательностей (дополнительные символы могут следовать за этими последовательностями.):

Ваш ock&roll считается "дополнительными символами".

В Python 3 разрешенные открытые режимы более ограничены (по существу, допустимы только допустимые строки).

Ответ 2

Предыдущая трассировка объясняет это красиво:

"Строка ValueError: mode должна начинаться с одной из 'r', 'w', 'a' или 'U'"

"rock & roll" начинается с "r", поэтому он, по-видимому, легален.