【问题标题】:'from X import a' works but 'import X; X.a' doesn't [duplicate]'from X import a' 有效,但 'import X; X.a'没有[重复]
【发布时间】:2019-08-22 01:04:11
【问题描述】:

在将this snippet 集成到脚本中时,我想更改:

import pywikibot
from pywikibot import pagegenerators

site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()

sparql = "SELECT ?item WHERE { ?item rdfs:label 'Google'@en }"
entities = pagegenerators.WikidataSPARQLPageGenerator(sparql, site=repo)

到:

import pywikibot

site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()

sparql = "SELECT ?item WHERE { ?item rdfs:label 'Google'@en }"
entities = pywikibot.pagegenerators.WikidataSPARQLPageGenerator(sparql, site=repo)

(即尝试将导入合并为一个)但它给了我一个错误:

AttributeError: module 'pywikibot' has no attribute 'pagegenerators'

(在我的桌面和云中的 Jupyter 笔记本上出现同样的错误)

我错过了什么?

【问题讨论】:

  • @Aran-Fey 谢谢,我猜它已经被问过了,但找不到。
  • pagegenerators 确实是一个子模块,但这还不是全部。由 pywikibot 模块的 _init_.py 文件决定将哪些内容直接导入默认命名空间。许多顶级模块将通过在其 _init.py_ 文件中为您执行 import 将其子模块导入全局命名空间。这可能就是您期望这种行为的原因。这并不罕见,因为模块实际上已经为您完成了第二次导入。然而,在这种情况下,pywikibot 的 _init_.py 并没有这样做,所以你必须自己做。

标签: python python-import


【解决方案1】:

Pagegenerators 不是属性,它是 pywikibot 内部的一个模块:https://m.mediawiki.org/wiki/Manual:Pywikibot/pagegenerators.py

子模块不会在这个特定模块中自动导入,这就是为什么你必须写from pywikibot import pagegenerators

【讨论】:

  • 好的,正如副本中所说:“当您只是 import X 时,子模块不会自动导入”。
  • ...正如我在评论中所描述的,在一般情况下并不是那么简单。但我看到@HeavenlyRaven 可能只是专门讨论这个模块,在这种情况下他是正确的。
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 2017-09-18
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多