【问题标题】:How would one import only a single value from a file?如何从文件中只导入一个值?
【发布时间】:2020-04-27 11:33:57
【问题描述】:

我知道您可以使用“from foo import bar”,但是,这实际上仍然会导入所有数据。我知道这一点的原因是因为我有一个包含变量的文件,其中一个变量包含大量数据。举一个伪例子,假设有问题的变量是 foo,它包含数字 1-100,000,000,加载所有这些数字大约需要 2 分钟。

这只是一个例子,实际数据要复杂得多。

无论如何,其他变量只是个位数或小列表或目录。然而,当我尝试导入其中任何一个时,所花费的时间就像我尝试导入 foo.xml 中的所有数据一样长。即使使用“From foo import bar”表示法也是如此。

我能想到的唯一解决方案是将这些变量存储在单独的文件中,然后在需要时只从文件集中读取我需要的内容,因此,每当我需要导入某些东西时,除非它是变量 foo,不会花很长时间。

当然,这不像将变量存储在单个文件中那样简洁,所以我想知道是否有一种方法可以做到这一点而不必一次导入所有内容?

我会说,当导入一次时,再次运行程序只需要大约两秒钟,这很好,但是我需要在多个模块中导入所说的数据,所以我现在的这个设计非常不理想.

提前感谢您的帮助。

【问题讨论】:

  • 相关thread。似乎没有比将大数据放在单独的模块中更好的方法了。

标签: python python-3.x import


【解决方案1】:

当您导入一个模块时,它会被解释(执行模块脚本)。您可以做的所有事情都是为您的特殊重变量使用代理。请注意,在正常使用中,模块是单例的,因此它只加载一次。 from foo import bar 只是在globals() 范围内存储变量引用的一种方式。

见:

关于惰性子模块导入的引用:

# lib/__init__.py

import importlib

__all__ = ['submod', ...]

def __getattr__(name):
    if name in __all__:
        return importlib.import_module("." + name, __name__)
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

# lib/submod.py

print("Submodule loaded")
class HeavyClass:
    ...

# main.py

import lib
lib.submod.HeavyClass  # prints "Submodule loaded"

【讨论】:

  • 啊,我明白了,所以我想 from foo import bar 技术对于解决名称冲突和方便(因此您不必总是使用 foo.bar)很有用。我一直认为这是为了节省加载时间,因为我认为它只是分析它正在导入的任何变量的值。您将如何为变量和/或数据设置代理?我之前从未听说过,但它似乎很有趣。
  • @JimJam,有几种方法可以实现缓存/代理/延迟导入。请参阅我的编辑以了解现代方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2021-08-28
  • 1970-01-01
  • 2017-09-05
  • 2021-03-21
  • 2014-07-24
  • 2015-10-28
相关资源
最近更新 更多