【问题标题】:Why does not `import lib.reload()` work for `itertools.count`?为什么 `import lib.reload()` 不适用于 `itertools.count`?
【发布时间】:2021-12-30 09:50:27
【问题描述】:

我想重新加载itertools 以重新加载函数count。这是我从我的 Mac(M1-air) 中得到的。

import itertools
for x in itertools.count(3,2):
  if x>30:
    break
  print(x) 
# works fine
# 3 5 7 9 11 13 15 17 19 21 23 25 27 29 
itertools.count = 10
print(itertools.count) # 10

import importlib
importlib.reload(itertools)
print(itertools.count) # 10

在我看来,最后的结果10应该改成原来的count函数,因为我用import lib.reload(itertools)重新加载了itertools

按照其中一个 cmets 的链接,现在我看到 itertools 是一个内置包,importlib.reload() 不适用于内置包。那么,如何重新加载内置包呢?

出于多种原因,想办法恢复我所做的事情是很自然的。 (如果您知道我的意思,那么寻找对称性也具有理论上的意义)例如,git revert... 当然,我总是可以留出一个变量并稍后使用它

count = itertools.count

itertools.count = 10

# then later
itertools.count = count

【问题讨论】:

  • docs.python.org/3/library/importlib.html#importlib.reload 中有各种警告可能适用于此。
  • 看来itertools 是一个内置包,这就是原因。那么如何重新加载内置包呢?
  • 您认为为什么需要这样做?在这种情况下,这是因为您已经替换了它的一个属性,所以...不要那样做。
  • 那么,您希望第二个print(itertools.count) 提出AttributeError: module 'itertools' has no attribute 'count'
  • 没有第二次打印会打印itertools.count,这与修改前print(itertools.count)的结果相同

标签: python import itertools python-importlib


【解决方案1】:

简单地“不要这样做”对任何人都没有帮助:( 就连goto也有一些拥护者(包括我记得的linux创始人)。

这是我想出的。只需删除模块并使用import 重新加载即可。

import itertools
count = itertools.count

itertools.count = 10

print(itertools.count) # 10

import sys

del sys.modules['itertools']
del itertools

import itertools

print(itertools.count) # itertools.count

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多