将绑定前缀赋值为变量
assignment of bound prefix as variable
我敢肯定我在这里遗漏了一些基本知识。使用 rdflib 解析 rdf 图形会为您提供一个带有 namespaces()
方法的图形对象。 returns 一个元组列表,其前缀绑定到命名空间 URIRef
s:
[('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace'))
('foo', rdflib.term.URIRef('http://example.org/scheme#'))
]
我希望这些前缀中的每一个都可以作为变量用于我的代码。我可以通过这样做明确地为每个人做到这一点:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
这样我就可以做这样的事情了:
g.subject_objects(foo.bar)
但是有没有一种 pythonic 的方法来获取这样的元组列表,并为每个项目分配第一个元素字符串作为第二个元素的变量?
虽然这在技术上可以使用 exec
,但我强烈建议采用不同的方法,例如使用字典。
namespaces = dict([
('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace')),
('foo', rdflib.term.URIRef('http://example.org/scheme#')),
])
...
g.subject_objects(namespaces['foo'].bar)
为了回答原来的问题,如果你绝对必须有动态的个体变量,那么你可以这样做:
for variable, value in [('xml', rdflib...), ('foo', rdflib...)]:
exec(f"{variable} = {value}")
...
g.subject_objects(foo.bar)
这会产生一堆您不知道的变量,而且可能会覆盖您不期望的其他变量。
仅供在此记录 post,以防将来有人访问:请记住 RDFlib 附带了一大堆已经加载的命名空间:
from rdflib.namespace import BRICK, CSVW, DC, DCAT, DCMITYPE, DCTERMS, DOAP, FOAF, ODRL2, ORG, OWL, PROF, PROV, QB, RDF, RDFS, SDO, SH, SKOS, SOSA, SSN, TIME, VANN, VOID, XMLNS, XSD
我倾向于这样声明我自己的命名空间:
from rdflib.namespace import RDFS, XSD
EG = Namespace("http://example.com/")
然后像其他人一样使用 EG,所以 <http://example.com/thing>
就是 EG.thing
.
这并不能解决直接提出的问题,但有助于了解。
此外,不需要:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
只需这样做:
from rdflib import Namespace
foo = Namespace("http://example.org/scheme#")
我敢肯定我在这里遗漏了一些基本知识。使用 rdflib 解析 rdf 图形会为您提供一个带有 namespaces()
方法的图形对象。 returns 一个元组列表,其前缀绑定到命名空间 URIRef
s:
[('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace'))
('foo', rdflib.term.URIRef('http://example.org/scheme#'))
]
我希望这些前缀中的每一个都可以作为变量用于我的代码。我可以通过这样做明确地为每个人做到这一点:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
这样我就可以做这样的事情了:
g.subject_objects(foo.bar)
但是有没有一种 pythonic 的方法来获取这样的元组列表,并为每个项目分配第一个元素字符串作为第二个元素的变量?
虽然这在技术上可以使用 exec
,但我强烈建议采用不同的方法,例如使用字典。
namespaces = dict([
('xml', rdflib.term.URIRef('http://www.w3.org/XML/1998/namespace')),
('foo', rdflib.term.URIRef('http://example.org/scheme#')),
])
...
g.subject_objects(namespaces['foo'].bar)
为了回答原来的问题,如果你绝对必须有动态的个体变量,那么你可以这样做:
for variable, value in [('xml', rdflib...), ('foo', rdflib...)]:
exec(f"{variable} = {value}")
...
g.subject_objects(foo.bar)
这会产生一堆您不知道的变量,而且可能会覆盖您不期望的其他变量。
仅供在此记录 post,以防将来有人访问:请记住 RDFlib 附带了一大堆已经加载的命名空间:
from rdflib.namespace import BRICK, CSVW, DC, DCAT, DCMITYPE, DCTERMS, DOAP, FOAF, ODRL2, ORG, OWL, PROF, PROV, QB, RDF, RDFS, SDO, SH, SKOS, SOSA, SSN, TIME, VANN, VOID, XMLNS, XSD
我倾向于这样声明我自己的命名空间:
from rdflib.namespace import RDFS, XSD
EG = Namespace("http://example.com/")
然后像其他人一样使用 EG,所以 <http://example.com/thing>
就是 EG.thing
.
这并不能解决直接提出的问题,但有助于了解。
此外,不需要:
foo = rdflib.Namespace(rdflib.term.URIRef('http://example.org/scheme#'))
只需这样做:
from rdflib import Namespace
foo = Namespace("http://example.org/scheme#")