Глагол определения функций не разрешает вызовы с дополнительными пунктирными именами; синтаксис ограничивается пунктирными именами и необязательным вызовом в конце :
decorated ::= decorators (classdef | funcdef)
decorators ::= decorator+
decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
dotted_name ::= identifier ("." identifier)*
Обратите внимание, что это не полное выражение, но очень ограниченное подмножество.
Это перекликается с PEP, который гласит:
Оператор декоратора ограничен тем, что он может принять, - произвольные выражения не будут работать. Гвидо предпочел это из-за чувства кишки [17].
blockquote>и
Обоснование наличия функции, возвращающей декоратор, состоит в том, что часть после Знак @ можно считать выражением (хотя синтаксически ограничивается только функцией), и все, что возвращает это выражение, вызывается. См. Декларационные аргументы [16].
blockquote>Акцент мой.
Обоснование заключается в том, что Гвидо считает, что нет реального варианта использования для разрешения :
Поэтому, хотя в будущем было бы довольно легко изменить синтаксис на @test, я хотел бы придерживаться более ограниченной формы, если не будет представлен реальный прецедент, где позволяя @test повысить читаемость. (@foo () не работает, потому что я не ожидаю, что вам это понадобится).
blockquote>Вам нужно будет убедить Guido и других основных разработчиков что ваш случай - это надлежащая утилита, достойная отмены этих ограничений!
Это - часто спрошенный вопрос. Существует Поваренная книга ASPN запись на нем, которая обслуживала меня в прошлом.
И существует обширная страница требований, которые один человек хотел бы видеть от модуля, делающего это.
Модуль битовой строки разработан для решения именно этой проблемы. Это позволит вам читать, изменять и создавать данные, используя биты в качестве основных строительных блоков. Последние версии предназначены для Python 2.6 или новее (включая Python 3), но версия 1.0 также поддерживает Python 2.4 и 2.5.
Уместным примером для вас может быть следующий, который удаляет все нулевые пакеты из транспортного потока (и вполне возможно, использует ваше 13-битное поле?):
from bitstring import Bits, BitStream
# Opening from a file means that it won't be all read into memory
s = Bits(filename='test.ts')
outfile = open('test_nonull.ts', 'wb')
# Cut the stream into 188 byte packets
for packet in s.cut(188*8):
# Take a 13 bit slice and interpret as an unsigned integer
PID = packet[11:24].uint
# Write out the packet if the PID doesn't indicate a 'null' packet
if PID != 8191:
# The 'bytes' property converts back to a string.
outfile.write(packet.bytes)
Вот еще один пример, включающий чтение из битовых потоков:
# You can create from hex, binary, integers, strings, floats, files...
# This has a hex code followed by two 12 bit integers
s = BitStream('0x000001b3, uint:12=352, uint:12=288')
# Append some other bits
s += '0b11001, 0xff, int:5=-3'
# read back as 32 bits of hex, then two 12 bit unsigned integers
start_code, width, height = s.readlist('hex:32, 2*uint:12')
# Skip some bits then peek at next bit value
s.pos += 4
if s.peek(1):
flags = s.read(9)
Вы можете использовать стандартную нотацию срезов для срезания, удаления, реверсирования, перезаписи и т. д. на битовом уровне, и есть биты уровень поиска, замены, разделения и т. д. функций. Также поддерживаются различные методы байтов.
# Replace every '1' bit by 3 bits
s.replace('0b1', '0b001')
# Find all occurrences of a bit sequence
bitposlist = list(s.findall('0b01000'))
# Reverse bits in place
s.reverse()
Полная документация здесь .