LINUX.ORG.RU

Ответ на: комментарий от anonymous

> хорошо будет не file( "name", "w+" ), а open("name", "w+").

Ну, они эквивалентны начиная с 2.2, так что технически разницы нет. А стилистически, мне непонятно, зачем для типа file использовать factory-function с именем open вместо file, когда для остальных типов используются конструкторы с именами, совпадающими с именем типа: int, list, dict, str, ...

В общем, по большому счету -- дело вкуса.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

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 ))

kozebuk
()
Ответ на: комментарий от kozebuk

Вас здорово снесло на другую тему, а меж тем запись кириллицы в файл при таком раскладе по-прежнему закодирована. Конечно, я могу написать свою функцию print, но не думаю, что это будет правильно и красиво.

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

В текущий момент сижу в Винде, следующий пример работает:

IDLE 1.2.1      
>>> import os
>>> os.chdir('C:\MyDoc')
>>> kaka = open('kaka.txt', 'w')
>>> print >> kaka, 'Жопа с ручкой, ядрёная вошь!'
>>> kaka.close()

Может, у вас не совпадают кодировки ввода и вывода?

kozebuk
()
Ответ на: комментарий от gtyrin

Прошу прощения за демонстрацию дебилизма, вы же говорили как раз про списки...

Наверно, придётся вам потанцевать...

kozebuk
()
Ответ на: комментарий от gtyrin

> а меж тем запись кириллицы в файл при таком раскладе по-прежнему закодирована.

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

ananas ★★★★★
()
Ответ на: комментарий от gtyrin

> >>> 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)

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

>4. list, str -- встроенные типы, поэтому заменить им __repr__ нельзя.

Не всё так плохо. Списки то нормально пишутся, проблемы только со строками. Т.ч. можно определить свою строку с __repr__==__str__. Только пользоваться неудобно.

Ещё можно определить свой файл, .write которого заменяет '\xXX' на соотв. символ. Только это костыль, причём ненадёжный.

Может просто не использовать print, если он так не нравится?

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.