> хорошо будет не file( "name", "w+" ), а open("name", "w+").
Ну, они эквивалентны начиная с 2.2, так что технически разницы нет. А стилистически, мне непонятно, зачем для типа file использовать factory-function с именем open вместо file, когда для остальных типов используются конструкторы с именами, совпадающими с именем типа: int, list, dict, str, ...
When opening a file, it's preferable to use open() instead of invoking this constructor directly. file is more suited to type testing (for example, writing "isinstance(f, file)").
Если вы хороший мальчик, то вы должны слушаться дядю Гвидо, ставить четыре пробела, забыть про табы и открывать файлы через open ))
Вас здорово снесло на другую тему, а меж тем запись кириллицы в файл при таком раскладе по-прежнему закодирована. Конечно, я могу написать свою функцию print, но не думаю, что это будет правильно и красиво.
В текущий момент сижу в Винде, следующий пример работает:
IDLE 1.2.1
>>> import os
>>> os.chdir('C:\MyDoc')
>>> kaka = open('kaka.txt', 'w')
>>> print >> kaka, 'Жопа с ручкой, ядрёная вошь!'
>>> kaka.close()
Может, у вас не совпадают кодировки ввода и вывода?
> >>> l=['Один']
> >>> print l
> ['\216\244\250\255']
Ах вот, что надо... Тяжелый случай.
1. print использует repr() для получения представления объекта.
2. print -- не функция, а оператор языка, поэтому переопределить не получится.
3. repr() вызывает метод __repr__ объекта.
4. list, str -- встроенные типы, поэтому заменить им __repr__ нельзя.
Придется писать собственное преобразование объекта в строку. Но:
1. Оно надо? умолчательное представление -- машиночитаемо, что в
большинстве случаев достаточно для автогенеримого текста.
2. Русский (и любой другой, отличный от 7-bit ASCII) текст в программе --
зло, кроме пары особых случаев. Тем более, в 8-битной строке без
указания кодировки и трансляции в кодировку локали.
def pretty(obj) :
if isinstance( obj, str ) :
return "'%s'" % obj # Для демонстрации. Требуется корректный ескейпинг
elif isinstance( obj, list ) :
return "[" + ",".join([ pretty(x) for x in obj ]) + "]"
elif isinstance( obj, tuple ) :
return "(" + ",".join([ pretty(x) for x in obj ]) + ")"
elif isinstance( obj, dict ) :
return "{" + ",".join([ "%s:%s" % (pretty(k),pretty(v)) for k,v in obj.iteritems() ]) + "}"
else :
if hasattr( obj, "__pretty__" ) :
return obj.__pretty__()
else:
return repr(obj)
l = ["Один"]
print pretty(l)
>4. list, str -- встроенные типы, поэтому заменить им __repr__ нельзя.
Не всё так плохо. Списки то нормально пишутся, проблемы только со строками. Т.ч. можно определить свою строку с __repr__==__str__. Только пользоваться неудобно.
Ещё можно определить свой файл, .write которого заменяет '\xXX' на соотв. символ. Только это костыль, причём ненадёжный.
Может просто не использовать print, если он так не нравится?