Вы хотите нежелательное совпадение, .*?
while( $string =~ /ABC(.*?)XYZ/gm ) {
$match = $1;
}
Не используйте класс enum, если вы хотите отобразить атрибуты в строки. Весь смысл пункта модуля enum
состоит в создании набора одноэлементных объектов, которые представляют перечисление, а не строки. Из документации модуля:
Перечисление - это набор символических имен (членов), связанных с уникальными постоянными значениями . В пределах перечисления члены могут сравниваться по тождеству , и само перечисление может быть повторено.)
blockquote>Мое выделение жирным шрифтом. Строки не являются уникальными, постоянными значениями (я могу создать больше
"Fido"
строк по желанию) и не предназначены для сравнения по тождеству (хотя иногда , для подмножества строк, вы можете ). [ 1135]Просто определите свой собственный класс с атрибутами, которые являются строками, напрямую:
class Pets: DOG = "Fido" CAT = "Kitty"
Ваша бесконечная ошибка рекурсии вызвана недопониманием с вашей стороны относительно того, для чего этот метод используется. Подобно всем специальным методам ,
object.attr
ищет__getattr__
для типа объекта , что означает здесь, что ваш метод применяется к экземплярам вашегоEnum
подкласса. атрибутыDOG
иCAT
здесь, а не самому классу, и мешают метаклассуEnumMeta
, пытающемуся проверить attibute_value_
, который обрабатывается вашим методом__getattr__
с использованиемself
недавно отчеканенный экземплярPets.DOG
иitem
установлены в'_value_'
, который затем вызываетgetattr(Pets.DOG, '_value_')
, который вызывает__getattr__
и т. д.Для вашего подхода к работе вам нужно будет создать подкласс
EnumMeta
и реализовать__getattribute__
для этого подкласса (__getattr__
только когда-либо вызывается для отсутствующих атрибутов ) , Тем не менее, учтите, что__getattribute__
используется для доступа ко всем атрибутам , поэтому вам нужно сначала позаботиться о проверке экземпляров текущего класса:class EnumDirectValueMeta(EnumMeta): def __getattribute__(cls, name): value = super().__getattribute__(name) if isinstance(value, cls): value = value.value return value class Pets(Enum, metaclass=EnumDirectValueMeta): DOG = "Fido" CAT = "Kitty"
в какой момент
Pets.DOG
производит'Fido'
.