Как изменить имя тега XML в Hy?
Это мой первый пост здесь...
Я пытаюсь изменить элемент XML с помощью присваивания в Hy (работает на Python 3).
Когда я пытаюсь запустить фрагмент кода:
(setv tco (BeautifulSoup "<meek/>" 'xml))
(setv (. tco meek name) "defl")
(print (. tco meek name))
;(assoc (. tco defl) "new" "value")
(.append (. tco meek) "Kool Stuff")
(print (.prettify tco))
Я получаю ошибку:
Traceback (последний вызов был последним): файл "/usr/bin/hy", строка 9, в load_entry_point('hy==0.11.0', 'файл console_scripts', 'hy')() "/usr/lib/python3/dist-packages/hy/cmdline.py", строка 347, в hy_main sys.exit(cmdline_handler("hy", sys.argv)) Файл" / usr / lib / python3 / dist-packages / hy / cmdline. py ", строка 335, в cmdline_handler возвращает файл run_file(options.args[0]), файл" /usr/lib/python3/dist-packages/hy/cmdline.py ", строка 210, в файле run_file import_file_to_module (" main ", имя файла) Файл "/usr/lib/python3/dist-packages/hy/importer.py", строка 78, в файле import_file_to_module eval(ast_compile(_ast, fpath, "exec"), mod. Dict) Файл "code-trace.hy", строка 196, in (setv (. tco meek name) "defl") AttributeError: объект 'NoneType' не имеет атрибута 'name'
Запуск со второй строки прокомментировал:
(setv tco (BeautifulSoup "<meek/>" 'xml))
;(setv (. tco meek name) "defl")
(print (. tco meek name))
;(assoc (. tco defl) "new" "value")
(.append (. tco meek) "Kool Stuff")
(print (.prettify tco))
Не дает ошибки (пришлось пометить, используя код вместо blockquote, чтобы он показывал правильно):
meek
<?xml version="1.0" encoding="utf-8"?>
<meek>
Kool Stuff
</meek>
Обратите внимание, что это всего лишь некоторый тестовый код для более крупной программы. У меня также есть проблемы с прокомментированным сотрудником на 4-й строке.
1 ответ
Это странно! Похоже, что при изменении имени (. Tco meek) становится None, который действительно не имеет атрибута name. Таким образом, вы должны поймать эту ошибку. Тогда вы должны ссылаться на (. Tco defl), потому что это то, как это известно после назначения. Это работает.
#+BEGIN_SRC hy
(import [bs4 [BeautifulSoup]])
(setv tco (BeautifulSoup "<meek/>" 'xml))
(try (setv (. tco meek name) "defl") (except [e Exception] (print e)))
(print (. tco defl))
(assoc (. tco defl) "new" "value")
(.append (. tco defl) "Kool Stuff")
(print (.prettify tco))
#+END_SRC
#+RESULTS:
: 'NoneType' object has no attribute 'name'
: <defl/>
: <?xml version="1.0" encoding="utf-8"?>
: <defl new="value">
: Kool Stuff
: </defl>
Если вы посмотрите на Python, который генерирует hy:
#+begin_example
from hy import HySymbol
from bs4 import BeautifulSoup
tco = BeautifulSoup(u'<meek/>', HySymbol(u'xml'))
try:
tco.meek.name = u'defl'
_hy_anon_var_1 = tco.meek.name
except Exception as e:
_hy_anon_var_1 = print(e)
print(tco.defl)
tco.defl[u'new'] = u'value'
tco.defl.append(u'Kool Stuff')
print(tco.prettify())
#+end_example
Вы можете увидеть ошибку в этой строке: _hy_anon_var_1 = tco.meek.name. Я предполагаю, что tco.meek.name не существует после строки до ее запуска, поэтому вы получаете сообщение об ошибке. Я не знаю, почему hy расширился бы таким образом, похоже, это связано с использованием (.) В коде, потому что другие выражения setv не расширяют этот путь.