0

这是我第一次发帖...

我正在尝试使用Hy(在 Python 3 上运行)中的赋值来更改 XML 元素。

当我尝试运行代码片段时:

(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))

我得到错误:

回溯(最后一次调用):文件“/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))

没有错误(必须使用代码而不是块引用进行标记,以便正确显示):

meek
<?xml version="1.0" encoding="utf-8"?>
<meek>
 Kool Stuff
</meek>

请注意,这只是针对较大程序的一些测试代码。我也遇到了第 4 行注释assoc的问题。

4

1 回答 1

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>

如果您查看 hy 生成的 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 表达式不会那样扩展。

于 2016-04-24T19:22:42.020 回答