2016-01-30 1 views
0

Это мой первый пост здесь ...Как изменить имя тега XML в Hy?

Я пытаюсь изменить элемент XML с помощью assignment в 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 (most recent call last): File "/usr/bin/hy", line 9, in load_entry_point('hy==0.11.0', 'console_scripts', 'hy')() File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 347, in hy_main sys.exit(cmdline_handler("hy", sys.argv)) File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 335, in cmdline_handler return run_file(options.args[0]) File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 210, in run_file import_file_to_module("main", filename) File "/usr/lib/python3/dist-packages/hy/importer.py", line 78, in import_file_to_module eval(ast_compile(_ast, fpath, "exec"), mod.dict) File "code-trace.hy", line 196, in (setv (. tco meek name) "defl") AttributeError: 'NoneType' object has no attribute '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> 

Обратите внимание, что это всего лишь некоторый тестовый код для более крупной программы. У меня также возникают проблемы с прокомментированным assoc на 4-й строчке.

ответ

0

Это странный! Похоже, что изменение имени делает (tco meek) равным None, у которого действительно нет атрибута имени. Поэтому вы должны поймать эту ошибку. Затем вам нужно обратиться к (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, который генерирует гип:

#+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 не расширяются таким образом.