Правильный способ расширить очередь Python? - PullRequest
5 голосов
/ 13 декабря 2011

Я пишу пользовательский подкласс Queue.Queue и сталкиваюсь с ситуацией, когда мне нужно получить блокировку на уровне очереди, когда вызывается мой пользовательский put().Я хотел бы повторно использовать существующую очередь блокировки (Queue.mutex), но не могу, потому что это не RLock.

В исходном коде (python 2.6) написано:

# Override these methods [_put, _get, etc] to implement other queue organizations
# (e.g. stack or priority queue).
# These will only be called with appropriate locks held

Но в онлайн-документации нет упоминаний об их переопределении.Другие реализации Queue в этом модуле переопределяют их.Итак, я склонен полагать, что метод _put является закрытым для пакета и на самом деле не предназначен для использования вне модуля очереди.

Кто-нибудь знает, насколько кошерным было бы использовать * 1012?* а друзья в моем подклассе?

1 Ответ

3 голосов
/ 13 декабря 2011

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

В частности, подобные детали не имеют отношения к большинству клиентов модуля Queue (которые просто используют классы), чтобы они не попали в опубликованные документы.Но если вы хотите создать подкласс Queue, разработчики ожидают, что вы будете копать глубже, поэтому в исходном коде есть примечание, которое вы можете найти.

Я также упомяну, что Python на самом деле не имеетпонятие «пакет-приват».Семантически, нет никакой разницы между подклассом, который находится в том же модуле, и тем, который находится в другом модуле, даже если вы пишете сами.На самом деле, в Python даже нет понятия «частный».Вместо этого он опирается на принцип ответственного использования: как разработчик вы должны быть достаточно умны, чтобы не использовать внутренние методы, когда вам это не нужно.Начало имени члена с подчеркиванием - это просто указание на то, что это внутренний метод, и что вам, вероятно, не следует обращаться к нему, если вы просто используете класс - но если вы подклассифицируете его, что-нибудьЧестная игра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...