使用 numpy 时,代码中有很多 np.*,例如

import numpy as np
y = np.sin(np.abs(np.linspace(0, 2*np.pi)))

这会使公式变得困惑并降低其可读性。可以使用通配符导入来解决这个问题
from numpy import *
y = sin(abs(linspace(0, 2*pi)))

然而,通配符导入几乎总是一个坏主意。

我想知道是否有可能将通配符导入到仅限于公式(或数学代码块)的上下文中。这将保持可读性并将命名空间污染限制在更容易控制的小代码区域。我想要这样的东西:
with import_wildcard(numpy):
    y2 = sin(abs(linspace(0, 2*pi)))

问题:
  • 是否有一些语言结构允许这样做。
  • 请求本身是否合理,还是我忽略了潜在问题?
  • 最佳答案

    解决方案 1:临时通配符导入:

    class import_wildcard(object):
        """Contextmanager to temporary import a package content into the global namespace."""
        def __init__(self, packagename):
            self.packagename = packagename
            self.package = __import__(self.packagename, globals(), locals())
            self.globals_backup = {}
    
        def __enter__(self):
            _globals = globals()
            for name in self.package.__dict__:
                if name in _globals:
                    self.globals_backup[name] = _globals[name]
            _globals.update(self.package.__dict__)
    
        def __exit__(self, exc_type, exc_value, exc_tb):
            _globals = globals()
            for name in self.package.__dict__:
                if name not in self.globals_backup:
                    del _globals[name]
            _globals.update(self.globals_backup)
            self.globals_backup.clear()
    
    
    with import_wildcard('numpy'):
        y = sin(abs(linspace(0, 2*pi)))
    

    到目前为止,我还没有遇到明显的缺点。当然,在上下文之外定义的与 numpy 中的某些函数同名的变量将无法在上下文中访问。

    关于python - numpy 公式的临时通配符导入/可读性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42862016/

    10-12 18:40