Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2015 18:19:16

tz4678@gmail.com
Зарегистрирован: 2014-12-07
Сообщения: 71
Репутация: +  -2  -
Профиль   Отправить e-mail  

vanished

vanished

Отредактировано tz4678@gmail.com (Авг. 1, 2020 15:49:26)

Офлайн

#2 Март 11, 2015 20:44:53

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

vanished

Начните с PEP8 .
Уберите поле __author__ для чего оно?
Каждый импорт в свой отдельной строчке.
Вместо ‘+’ и “типа констант” используете метод format.
Где докстринги ?
Где тесты?
Зачем тут нужна имитация приватных данных и методов с ‘_’ ?
Какую смысловую нагрузку имеет метод encoding c декоратором @property если свойство класса encoding в классе не изменяется? Возможно и с другими методами также, дальше не смотрел.





Офлайн

#3 Март 11, 2015 21:56:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

Alen
Какую смысловую нагрузку имеет метод encoding c декоратором @property если свойство класса encoding в классе не изменяется?
Просмотр кодировки, которая устанавливается при создании экземпляра.

>>> f = open('/etc/passwd')
>>> f.encoding
'UTF-8'
>>> f.encoding = 'x'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
>>>

Alen
Зачем тут нужна имитация приватных данных и методов с ‘_’ ?
Это не приватные методы, а вспомогательные (служебные). Просто, чтобы они в документацию (help) не попадали, у них ставится подчёркивание.

Alen
Вместо ‘+’ и “типа констант” используете метод format.
У байтовых объектов нет метода .format()

>>> b''.format
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'format'
>>>


tz4678@gmail.com
s.replace('\n', '%0A').replace('\r', '%0D').replace('"', '%22')))
Вот так делать, конечно, не надо - мало ли, что там ещё может быть. Меняй либо через .translate()
>>> '\r\n"'.translate(str.maketrans({'\r': '%0D', '\n': '%0A', '"': '%22'}))
'%0D%0A%22'
>>>
либо здесь подойдёт и другой способ, раз преобразование прямое.

>>> import re
>>> 
>>> s = 'abc\r\r\n\ndef"'
>>> 
>>> re.sub(r'[\r\n"]', lambda mo: '%{:02X}'.format(ord(mo.group())), s)
'abc%0D%0D%0A%0Adef%22'
>>>



Отредактировано py.user.next (Март 11, 2015 22:16:51)

Офлайн

#4 Март 12, 2015 01:39:01

tz4678@gmail.com
Зарегистрирован: 2014-12-07
Сообщения: 71
Репутация: +  -2  -
Профиль   Отправить e-mail  

vanished

vanished

Отредактировано tz4678@gmail.com (Авг. 1, 2020 15:49:28)

Офлайн

#5 Март 12, 2015 01:39:50

tz4678@gmail.com
Зарегистрирован: 2014-12-07
Сообщения: 71
Репутация: +  -2  -
Профиль   Отправить e-mail  

vanished

vanished

Отредактировано tz4678@gmail.com (Авг. 1, 2020 15:49:29)

Офлайн

#6 Март 12, 2015 02:18:30

tz4678@gmail.com
Зарегистрирован: 2014-12-07
Сообщения: 71
Репутация: +  -2  -
Профиль   Отправить e-mail  

vanished

vanished

Отредактировано tz4678@gmail.com (Авг. 1, 2020 15:49:30)

Офлайн

#7 Март 12, 2015 07:37:40

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

vanished

py.user.next
Просмотр кодировки, которая устанавливается при создании экземпляра.

её и так можно посмотреть без метода:

class A:                                                                                                                         
    def __init__(self, encoding='utf-8'):
        self.encoding = encoding
 
class B:
    def __init__(self, encoding='utf-8'):
        self._encoding = encoding
 
    @property
    def encoding(self):
         return self._encoding   
a = A()
a.encoding
'utf-8'
b = B()
b.encoding
'utf-8'
c = A('koi8-r')
c.encoding
'koi8-r'                                                                                                                                                                                                              

py.user.next
Это не приватные методы, а вспомогательные (служебные). Просто, чтобы они в документацию (help) не попадали, у них ставится подчёркивание.

Пример без подчеркивания выше, таки ‘encoding’ и так и так в документацию попадет, всё дело в размере кода и его читаемости. Есть места где это нужно по каким-то соображениям, но не здесь.

py.user.next
байтовых объектов нет метода .format()

А зачем они байтовые?

Отредактировано Alen (Март 12, 2015 07:44:58)

Офлайн

#8 Март 12, 2015 07:40:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

vanished

Alen
её и так можно посмотреть без метода
Но таким образом его и задать можно. ТС сделал свойство только для чтения, чтобы предотвратить изменение кодировки после инициализации класса.



Офлайн

#9 Март 12, 2015 07:48:50

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

vanished

FishHook
Но таким образом его и задать можно. ТС сделал свойство только для чтения, чтобы предотвратить изменение кодировки после инициализации класса.

Спасибо, об этом я как-то не подумал, правда ума не приложу зачем оно такое.

Офлайн

#10 Март 12, 2015 09:21:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

Alen
её и так можно посмотреть без метода:
Так нельзя смотреть. Происходит привязка программы к внутреннему содержимому объекта. Это что-то вроде глобальных переменных - то есть на первый взгляд выглядит удобным, но делать так нельзя.

Alen
Пример без подчеркивания выше, таки ‘encoding’ и так и так в документацию попадет
Если это свойство, то оно и должно попасть, так как свойство предназначено для использования объекта снаружи .

Alen
всё дело в размере кода и его читаемости
Свойства - часть интерфейса объекта. Каким бы ни было его содержимое, свойства гарантируют определённое поведение.

Alen
А зачем они байтовые?
Видимо, чтобы не перекодировать их лишний раз из юникода в ascii.



Отредактировано py.user.next (Март 12, 2015 09:40:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version