Еще один ответ - использовать рецепт «Назначить и проверить», чтобы разрешить назначение и тестирование в одном утверждении, опубликованном в 1'й редакции O'Reilly Media за июль 2002 г. Python Cookbook , а также онлайн в Activestate. Это объектно-ориентированный, суть которого такова:
# from http://code.activestate.com/recipes/66061
class DataHolder:
def __init__(self, value=None):
self.value = value
def set(self, value):
self.value = value
return value
def get(self):
return self.value
Это можно при желании слегка изменить, добавив показанный ниже пользовательский метод __call__()
, чтобы обеспечить альтернативный способ извлечения значений экземпляров, который, хотя и менее явный, выглядит совершенно логичным для объекта DataHolder, чтобы думаю, когда позвонят.
def __call__(self):
return self.value
Разрешение переписать ваш пример:
r = DataHolder()
for s in strings:
if r.set(regex.match(s))
print r.get().groups()
# or
print r().groups()
Как также отмечено в оригинальном рецепте, если вы часто его используете, добавление класса и / или его экземпляра в модуль __builtin__
, чтобы сделать его доступным в глобальном масштабе, очень заманчиво, несмотря на возможные недостатки:
import __builtin__
__builtin__.DataHolder = DataHolder
__builtin__.data = DataHolder()
Как я уже упоминал в своем другом ответе на этот вопрос, следует отметить, что этот подход ограничен удержанием только одного результата / значения за раз, поэтому для обработки ситуаций, в которых требуется несколько значений, требуется более одного экземпляра. сохраняются одновременно, например, во вложенных вызовах функций, циклах или других потоках. Это не значит, что вы должны использовать его или другой ответ, просто потребуется больше усилий.