2

検索しましたが、質問に対する直接的な回答が見つかりませんでした。これが既に投稿/回答されている場合はお詫び申し上げます。私はPythonで作業しており、変数を含む式を渡す必要がありますが、すぐに評価したくありません。

例えば:

r = x*y

rを計算するには、その時点で明示的に計算するのではなく、xとyを乗算する必要があることをプログラムに覚えてもらいたいです。私は使用してみました:

x = None
y = None
r = x*y

しかし、これは変数に対する操作を許可しません。文字列を使用してから「eval」を使用して管理しましたが、非常にエレガントなソリューションではなく、非常に遅いです。これを行うより良い方法はありますか?

4

2 に答える 2

4

lambda次の式を使用できます。

>>> x = None
>>> y = None
>>> r = lambda : x*y
>>> r()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
>>> x = 1
>>> y = 2
>>> r()
2

クラスを使用して、もう少し派手にすることもできます。

class DeferredEval(object):
    def __init__(self,func):
        self.func = func

    def __call__(self):
        return self.func()

    def __add__(self,other):
        return self.func() + other

    def __radd__(self,other):
        return other + self.func()


x = None
y = None
r = DeferredEval(lambda:x*y)

try:
    a = 1 + r
except TypeError as err:
    print "Oops, can't calculate r yet -- Reason:",err

x = 1
y = 2
print 1 + r
print r + 1

出力で:

Oops, can't calculate r yet -- Reason: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
3
3

もちろん、足し算、引き算以外のことをしたい場合は、ここでさらに多くのメソッドを追加する必要があります...もちろん、結果を得るために実際に呼び出す r必要があります-しかしそんなに悪くないですよね?

于 2013-01-08T16:06:24.813 に答える
0

Math Evaluatorユーティリティのソースコードを見て、後で評価するための式を作成する方法を理解することができます。Ideone.comでのこのデモンストレーションは、コードが何を達成できるかを示すのに役立ちます。

if __name__ == '__main__':
    # Run a simple demo that shows evaluator's capability.
    namespace = {}
    expression = tokens('x * y -> r')
    print expression
    evaluate('2 -> x; 3 -> y', namespace)
    expression.evaluate(namespace)
    print 'r =', namespace['r']
    alternate = Operation(Operation(Variable('x'), '+', Variable('y')), '->', Variable('r'))
    print alternate
    alternate.evaluate(namespace)
    print 'r =', namespace['r']
于 2013-01-08T18:20:20.973 に答える