使用 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/