绑定前缀作为变量的赋值



我肯定这里缺少一些基本的东西。使用rdflib解析rdf图,可以得到一个使用namespaces()方法的图对象。这返回一个带有前缀的元组列表,这些前缀绑定到命名空间URIRefs:

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

但是,有没有一种蟒蛇般的方法来获取这样一个元组列表,并为每个项分配第一个元素字符串作为第二个元素的变量?

虽然使用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)

这将创建一堆你不知道的变量,还可能覆盖其他你不期望的变量。

为了记录这篇文章,以防将来有人访问:请记住,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#")

最新更新