将绑定前缀赋值为变量

assignment of bound prefix as variable

我敢肯定我在这里遗漏了一些基本知识。使用 rdflib 解析 rdf 图形会为您提供一个带有 namespaces() 方法的图形对象。 returns 一个元组列表,其前缀绑定到命名空间 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)

但是有没有一种 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#")