gpt4 book ai didi

python - 在 numexpr 表达式中使用对象属性

转载 作者:太空宇宙 更新时间:2023-11-04 09:37:45 24 4
gpt4 key购买 nike

我正在尝试在 numexpr 表达式中使用对象属性。最明显的做法是:

import numpy as np
import numexpr as ne

class MyClass:
def __init__(self):
self.a = np.zeros(10)

o = MyClass()

o.a

b = ne.evaluate("o.a+1")

导致如下错误

---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-22-dc90c81859f1> in <module>()
10 o.a
11
---> 12 b = ne.evaluate("o.a+1")

~/.local/lib/python3.5/site-packages/numexpr/necompiler.py in evaluate(ex, local_dict, global_dict, out, order, casting, **kwargs)
799 expr_key = (ex, tuple(sorted(context.items())))
800 if expr_key not in _names_cache:
--> 801 _names_cache[expr_key] = getExprNames(ex, context)
802 names, ex_uses_vml = _names_cache[expr_key]
803 arguments = getArguments(names, local_dict, global_dict)

~/.local/lib/python3.5/site-packages/numexpr/necompiler.py in getExprNames(text, context)
706
707 def getExprNames(text, context):
--> 708 ex = stringToExpression(text, {}, context)
709 ast = expressionToAST(ex)
710 input_order = getInputOrder(ast, None)

~/.local/lib/python3.5/site-packages/numexpr/necompiler.py in stringToExpression(s, types, context)
296 names.update(expressions.functions)
297 # now build the expression
--> 298 ex = eval(c, names)
299 if expressions.isConstant(ex):
300 ex = expressions.ConstantNode(ex, expressions.getKind(ex))

<expr> in <module>()

AttributeError: 'VariableNode' object has no attribute 'a'

咨询another question ,我能够通过使用 numexprglobal_dict 得到一个不太令人满意的解决方案:

import numpy as np
import numexpr as ne

class MyClass:
def __init__(self):
self.a = np.zeros(10)

o = MyClass()

o.a

b = ne.evaluate("a+1", global_dict={'a':o.a})

一旦 MyClass 有十几个属性并且有一些对 ne.evaluate 的调用,这将变得非常困惑。

有没有一种简单、干净的方法来做到这一点?

最佳答案

如果您的对象开始具有大量属性,您主要关心的似乎是 evaluate 调用的可扩展性/可维护性。您可以通过传递 vars(o) 来自动化这部分:

import numpy as np
import numexpr as ne

class MyClass:
def __init__(self):
self.a = np.arange(10000)
self.b = 2*self.a

o = MyClass()

c = ne.evaluate("a+b", local_dict=vars(o))

请注意,我使用了 local_dict,因为将这些名称放入本地 namespace 可能会稍微快一些。如果实例属性有可能与脚本中的本地名称发生冲突(这在很大程度上取决于您如何命名属性以及类的作用),那么将 vars 作为 传递可能更安全>global_dict 就像在问题中一样(出于同样的原因 as noted in a comment )。

您仍然需要跟踪实例属性和它们在 numexpr 表达式中的名称之间的对应关系,但是上面的内容可以跳过大部分工作。

关于python - 在 numexpr 表达式中使用对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53054696/

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