gpt4 book ai didi

python - 临时通配符导入/numpy 公式的可读性

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:32 24 4
gpt4 key购买 nike

使用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. 是否有某种语言结构允许这样做。
  2. 请求本身是否合理,还是我忽略了潜在问题?

最佳答案

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com