HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > PHP
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 15.07.2009, 12:24
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Цитата:
Сообщение от Fata1ex  
Если оставлять его необязательным, то увеличивается гибкость программы, так как во время открытия файла возможно использование любой кодировки. По-моему так
Кодировки есть грабли, через которые проходят очень многоие (я в свое время очень конкретно намучился с этим, да и не один я), просто за счет того чтобы сделать его обязательным (имется ввиду убрать значение по умолчанию), то гибкость не страдает, так как можно выбрать любую, зато отпадает куча вопросов и проблем на тему "А почему у меня крякозябры показывает", айс в py3k то что для внутреннего представления выбран юникод, в 2.6 я делал всем загрузкам из файлов вручную перекодирование в юникод, получалась конкретная путаница

Чтоб не быть голословным:
Код:
......
    def load(self, data, data_encoding=None):
        if data_encoding is None:
            data_encoding = self.defaultencoding
        self.Lock.acquire()
        for line in data:
            self.Container.append(line.translate(None, "\r\n").decode(data_encoding, "replace"))
        if self.StringVar is not None:
            try:
                self.StringVar.set(len(self.Container))
            except RuntimeError:
                pass
        self.Lock.release()
......
    def dump(self, outfile, data_encoding=None, remove=False):
        if data_encoding is None:
            data_encoding = self.defaultencoding
        self.Lock.acquire()
        with open(outfile, "a") as out:
            for item in self.Container:
                out.write("{0}\n".format(item.encode(data_encoding, "replace")))
        if remove:
            self.Container = []
        if self.StringVar is not None:
            try:
                self.StringVar.set(len(self.Container))
            except RuntimeError:
                pass
        self.Lock.release()
......

Последний раз редактировалось login999; 15.07.2009 в 12:27..
 
Ответить с цитированием

  #2  
Старый 15.07.2009, 12:32
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

В том-то и дело, чтобы на эти грабли не наступать, сделали значение опциональным. Во многих случаях не важно с какой кодировкой работать.
# ps. код это ваще пэпэцэ
 
Ответить с цитированием

  #3  
Старый 15.07.2009, 12:41
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Цитата:
Сообщение от Fata1ex  
В том-то и дело, чтобы на эти грабли не наступать, сделали значение опциональным. Во многих случаях не важно с какой кодировкой работать.
# ps. код это ваще пэпэцэ
Вот так это выглядит в py3k (от StringVar отказался, так как встроил Thread-safe счетчики в гуй )
Код:
......
    #Сюда нужно отправлять что типа такого 
#with open("bla.txt", encoding=encoding) as inpt:
#some.load(inpt)
    #Атрибут загрузки из последовательности(или итератора)
    def load(self, data):
        self.__Lock.acquire()
        for line in data:
            self.__Container.append(line.strip("\r\n"))
        self.__Lock.release()
......
    #Атрибут дампа всех элементов контейнера в файл
    def dump(self, outfile, encoding):
        self.__Lock.acquire()
        with open(outfile, "a", encoding=encoding) as out:
            for item in self.__Container:
                out.write("{0}\n".format(item))
        self.__Lock.release()
......
 
Ответить с цитированием

  #4  
Старый 15.07.2009, 12:47
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

Цитата:
encoding=encoding
эээ?
 
Ответить с цитированием

  #5  
Старый 15.07.2009, 12:50
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Цитата:
Сообщение от Fata1ex  
эээ?
encoding имеется ввиду кодировка, пусть будет encoding="utf8", если так понятнее
Код:
#with open("bla.txt", encoding="utf8") as inpt:
#some.load(inpt)
 
Ответить с цитированием

  #6  
Старый 15.07.2009, 14:09
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

Я знаю, что такoe 'encoding', но зачем писать encoding=encoding, разве это нельзя опустить?
 
Ответить с цитированием

  #7  
Старый 15.07.2009, 14:29
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


По умолчанию

Цитата:
Я знаю, что такoe 'encoding', но зачем писать encoding=encoding, разве это нельзя опустить?
Зависит от порядка передачи аргументов в ф-цию, если передаем не по порядку определенном в прототипе дк так и надо писать )
 
Ответить с цитированием

  #8  
Старый 15.07.2009, 14:44
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Цитата:
Сообщение от razb  
Зависит от порядка передачи аргументов в ф-цию, если передаем не по порядку определенном в прототипе дк так и надо писать )
Ты прафф, я привык к некоей недисциплинированности, часть параметров передаю по порядку, часть по именованию, когда как короче

P.S. Только что разбирался с кодировками в py3k все немного не так как я представлял, немного парят танцы с бубном. В качестве внутреннего отображения выбран utf8 , я привык его считать отличным от юникода, поэтому мои надежды на красивое string_in_utf8 = inside_string.encode("utf8") разбились в прах, приходится шаманить и сначала переводить в байты, а потом в нужную кодировку string_in_cp1251 = inside_string.encode("utf8").decode("cp1251")
Чет как-то не так как хотелось бы
 
Ответить с цитированием

  #9  
Старый 15.07.2009, 14:38
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

В py3k по умолчанию идет чтение. Во-вторых, там порядок такой (имя, режим, кодировка= ). Так что это там ни при чем )
encoding = encoding..я теперь спать не буду ответь мне!
 
Ответить с цитированием

  #10  
Старый 15.07.2009, 14:48
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Цитата:
Сообщение от Fata1ex  
В py3k по умолчанию идет чтение. Во-вторых, там порядок такой (имя, режим, кодировка= ). Так что это там ни при чем )
encoding = encoding..я теперь спать не буду ответь мне!
Ну почему же, он прав, просто я не указываю режим работы с файлом, ибо мне нужно чтение, поэтому приходится указывать параметры функции кусками, т.е. по хорошему это должно выглядеть либо open(file="bla.txt", encoding="cp1251"), либо open("bla.txt", "r", None, "cp1251"), я юзаю недисциплинированно-гибридный вариант open("bla.txt", encoding="cp1251") , оставляя значение режима работы с файлом по умолчанию, каюсь, обязательно исправлюсь (если не забуду )

P.S. порядок там такой
Цитата:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

Последний раз редактировалось login999; 15.07.2009 в 14:53..
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.