Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в байтс прибавить байт ? 
:(
    Опции темы
volatile
Дата 19.11.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



В связи с переходом на 3-ую версию, возник ряд идиотских непоняток.
одна из них

Как в байтс прибавить байт ?
т.е

Код
a = bytes()  #  пусть a - это bytes
n = 250      #  n - это сам байт который надо прибавить.

Во 2-ом питоне было просто
a += chr (n)
здесь такое не прокатывает.

Нашел конечно пару способов, но мне они не нравятся.
a += bytes ([n])
не нравится тем, что обязательно нужно заключать в [], иначе фигня получится. (ладно бы ошибка возникала)

a += bytes (range (n, n + 1))
Ну тоже абсолютно не нравится.

a += bytes.fromhex (hex (n)[2:])
еще один идиотский способ.

хотелось бы что-то такое:
a += byte (n)
элементарная же вещь, просто прибавить нужный байт?

PM MAIL   Вверх
4ell
Дата 26.11.2012, 21:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Из документации
bytes([source[, encoding[, errors]]])
Return a new “bytes” object, which is an immutable sequence of integers in the range 0 <= x < 256. bytes is an immutable version of bytearray – it has the same non-mutating methods and the same indexing and slicing behavior.

Юзайте bytearray, какой смысл использовать неизменяемый объект?

Код

b = bytearray()
b.append(0xfa)

PM MAIL   Вверх
volatile
Дата 27.11.2012, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



4ell, большое спасибо.

Цитата(4ell @  26.11.2012,  21:46 Найти цитируемый пост)
какой смысл использовать неизменяемый объект?

Код

b = bytearray()
b.append(0xfa)
d = {}
d [b] = 1
print (d)
--------
Traceback (most recent call last):
  File "1.py3", line 4, in <module>
    d [b] = 1
TypeError: unhashable type: 'bytearray'

Код

b = bytes()
b += bytes([0xfa])
d = {}
d [b] = 1
print (d)
--------
{b'\xfa': 1}


Не хотелось гонять из bytes в bytearray, на каждом шагу.
В общем написал пока такую функцию:
Код

def byte (i) :
   return bytes ([i])

и делаю как и хотел:
Цитата(volatile @  19.11.2012,  23:49 Найти цитируемый пост)
a += byte (n)


Добавлено через 1 минуту и 18 секунд
ps: вообще, имхо не совсем продумано разработчиками.
В той же документации, говориться: там где использовались анси строки, теперь нужно использовать bytes
Строки тоже были неизменяемые, но с ними такой проблемы не было.

PM MAIL   Вверх
4ell
Дата 27.11.2012, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Вот что они написали про создание bytes объектов
Код

4.8.1. Bytes
In addition to the literal forms, bytes objects can be created in a number of other ways:
zero-filled bytes object of a specified length: bytes(10)
From an iterable of integers: bytes(range(20))
Copying existing binary data via the buffer protocol: bytes(obj)

Путаница с 3м питоном определенно есть, лично я так до сих пор 2.7 использую и доволен.

Если уж красивостей хочется, почему бы не унаследоваться от bytes и не перeписать метод __add__? 
Например так 
Код

class MyBytes(bytes):
   def __add__(self, b):
       if type(b) == int:
           b = bytes([b])
       return super().__add__(b)


Это сообщение отредактировал(а) 4ell - 27.11.2012, 03:01
PM MAIL   Вверх
volatile
Дата 27.11.2012, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(4ell @  27.11.2012,  03:00 Найти цитируемый пост)
почему бы не унаследоваться от bytes 

и использовать везде MyBytes, вместо bytes?
Не известно как он поведет себя с другими объектами.
Да и не стоит оно того. 
Хотелось минимальными усилиями.
Вообще я думал что есть готовая функция, как chr (), у стринга.
Думал просто не нашел, потому задал вопрос.



PM MAIL   Вверх
volatile
Дата 27.11.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(4ell @  27.11.2012,  03:00 Найти цитируемый пост)
лично я так до сих пор 2.7 использую и доволен.

Я Python использую не так давно, и для небольших "скриптовых" нужд.
Но постепенно накопилось уже несколько десятков программок.

И подумалось, пока их не так много, может сразу перейти на 3-ий, не так много потом нужно будет переписывать.
А переходить ведь, рано или поздно придется.

Сейчас, в принципе все свои основные скрипты я уже переписал.
Более-менее все работает нормально. И, на сегодняшний день, я доволен 3-им пайтоном.
Хотя в начале перехода рвал и метал. smile 
Сейчас устаканилось. Стал даже замечать плюсы.

PM MAIL   Вверх
4ell
Дата 27.11.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Цитата(volatile @ 27.11.2012,  18:08)
Не известно как он поведет себя с другими объектами.
Да и не стоит оно того.

На счет не стоит - согласен.
А поведение должно остаться таким же, только если прибавить к объекту другой типа int поведение меняется.

Вообще в Python многие вещи можно сделать коротко и красиво, этим он мне и нравиться.
Правда приходится расплачиваться за это производительностью...

Конкретно по поводу вариантов записи
Код

1. a += bytes (n)
2. a += bytes ([n])

Разработчики решили для первого случая возвращать bytes заполненный n нулями, что вполне логично.
Второй вариант инициализации bytes(p) где p итерируемый объект, содержащий числа, что тоже вполне логично.

Я так ничего страшного не вижу в записи bytes ([n]). Наверное это вопрос вкуса smile
PM MAIL   Вверх
volatile
Дата 28.11.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(4ell @  27.11.2012,  22:45 Найти цитируемый пост)
Я так ничего страшного не вижу в записи bytes ([n]). Наверное это вопрос вкуса  

Дело не во вкусе. Можно очень легко забыть про [], и интерпретатор ни словом тебе об этом не напомнит. 
Так как это является валидной операцией. (просто делающей совсем не то что тебе нужно)

Цитата(4ell @  27.11.2012,  22:45 Найти цитируемый пост)
решили для первого случая возвращать bytes заполненный n нулями, что вполне логично.

Если учесть что bytes это неизменяемый объект, то имхо, ничего логичного здесь нет.
Неизменяемая цепочка нулевых байт, не думаю что очень часто нужно такое.
Впрочем, это мое имхо.

PM MAIL   Вверх
4ell
Дата 28.11.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Цитата
Дело не во вкусе. Можно очень легко забыть про [], и интерпретатор ни словом тебе об этом не напомнит. 

Хм, ваша правда забыть можно, но можно и комментарием обозначить это место .

Цитата
Если учесть что bytes это неизменяемый объект, то имхо, ничего логичного здесь нет.

Опять же bytes это неизменяемая версия bytearray. В документации написано, что все non-mutating методы были унаследованы от bytearray, а __init__ тоже входит в их число.

Это сообщение отредактировал(а) 4ell - 28.11.2012, 15:18
PM MAIL   Вверх
volatile
Дата 28.11.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



 smile 
4ell, не хочу создавать отдельную тему из-за такой мелочи, но давно хотел спросить
Как в RAW строке ввести последний слеш ?
Код

s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n\'
print (s)
-------------
  File "1.py3", line 1
    s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n\'
                                       ^
SyntaxError: EOL while scanning string literal


PM MAIL   Вверх
4ell
Дата 29.11.2012, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Я понял ваш намек на несовершенство питона, разве человек может создать что-то идеальное?
Но все же и эта тема освещена в документации
Код

Even in a raw string, string quotes can be escaped with a backslash, but the backslash 
remains in the string; for example, r"\"" is a valid string literal consisting of 
two characters: a backslash and a double quote; r"\" is not a valid string literal 
(even a raw string cannot end in an odd number of backslashes). Specifically, a raw string 
cannot end in a single backslash (since the backslash would escape the following quote 
character). Note also that a single backslash followed by a newline is interpreted 
as those two characters as part of the string, not as a line continuation.

Можно конечно поизвращаться
Код

s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n'+'\\'
s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n'+'\x5c'
s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n\\'[:-1]
s = r'\a\b\c\d\e\f\g\h\i\j\k\l\m\n\ '.rstrip()
print (s)


Это сообщение отредактировал(а) 4ell - 29.11.2012, 01:56
PM MAIL   Вверх
volatile
Дата 29.11.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Да, c RAW строками явно недодумали.
(могли бы хотябы в тройных кавычках позволить )


4ell, большое спасибо.


Это сообщение отредактировал(а) volatile - 29.11.2012, 10:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.