Я не думаю, что вы получите представление, которое вы хотите от размышлений.
(Reflection не был предназначен для высокопроизводительного использования - и, по моему опыту, очень редко используется в производственном коде. Он отлично подходит для тестирования, каркасов, инструментов сборки и т. Д., Но в большинстве вопросов, которые я вижу о верно, реальный ответ - использовать лучший дизайн, который не нуждается в отражении!)
Ни один из двух других подходов, конечно, не идеален. Это, вероятно, зависит от точных требований. Должны ли они вообще быть объектами с именованными свойствами Kotlin или они могут быть простыми картами? Последний может быть проще для кода и проще в обслуживании. Остальные жестко запрограммированные тесты, вероятно, спасут память.
(Если бы у вас было много времени, вы могли бы написать какой-то инструмент для сборки, который мог бы автоматически генерировать метод поиска с этими жестко заданными для вас тестами. Что будет использовать отражение, конечно, , но только во время компиляции. Это будет большая работа, и я не знаю, как вы к ней подойдете.)
Проверьте этот вопрос . То, что вы ищете, это «декодирование HTML-сущности». Как правило, вы найдете функцию с именем что-то вроде «htmldecode», которая будет делать то, что вы хотите. Как Django, так и Cheetah предоставляют такие функции, как BeautifulSoup.
Другой ответ будет отлично работать, если вы не хотите использовать библиотеку и все сущности являются числовыми.
Попробуйте это: (нашел его здесь )
from htmlentitydefs import name2codepoint as n2cp
import re
def decode_htmlentities(string):
"""
Decode HTML entities–hex, decimal, or named–in a string
@see http://snippets.dzone.com/posts/show/4569
>>> u = u'E tu vivrai nel terrore - L'aldilà (1981)'
>>> print decode_htmlentities(u).encode('UTF-8')
E tu vivrai nel terrore - L'aldilà (1981)
>>> print decode_htmlentities("l'eau")
l'eau
>>> print decode_htmlentities("foo < bar")
foo < bar
"""
def substitute_entity(match):
ent = match.group(3)
if match.group(1) == "#":
# decoding by number
if match.group(2) == '':
# number is in decimal
return unichr(int(ent))
elif match.group(2) == 'x':
# number is in hex
return unichr(int('0x'+ent, 16))
else:
# they were using a name
cp = n2cp.get(ent)
if cp: return unichr(cp)
else: return match.group()
entity_re = re.compile(r'&(#?)(x?)(\w+);')
return entity_re.subn(substitute_entity, string)[0]
Наиболее надежным решением, по-видимому, является эта функция от светофора Python Фредрика Лунда. Это не самое короткое решение, но оно обрабатывает именованные объекты, а также шестнадцатеричные и десятичные коды.