我在問如何讓「關閉」以重載and
運算符的建議。鏈接比較(重載不可重載的「和」運算符)
import operator
OP = { operator.ge: ">=", operator.le: "<=" }
class Expression(object):
def __init__(self, left, right, op):
self.left = left
self.right = right
self.op = op
def __le__(self, other):
return Expression(self, other, operator.le)
def __ge__(self, other):
return Expression(self, other, operator.ge)
def __str__(self):
return "(%s %s %s)" % (self.left, OP[self.op], self.right)
def __repr__(self):
return "<Expression: %s %s %s>" % (self.left, self.op, self.right)
class Variable(Expression):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def __repr__(self):
return "<Variable: %s>" % self.name
def _and(left, right):
return (left, right)
print 1 <= Variable("x") <= 3
print _and(1 <= Variable("x"), Variable("x") <= 3)
上面的例子打印::一個代碼示例以我在做什麼暗示
(x <= 3)
(<Expression: x <built-in function ge> 1>, <Expression: x <built-in function le> 3>)
按照Python docs表達1 <= a <= 2
轉化爲1 <= a and a <= 2
,所以我猜,在我的示例1 <= Variable("x")
的計算結果爲True
,因此表達式返回值Variable("x") <= 3
。我需要一種方法分別得到兩個表達式(1 <= a
和a <= 2
),並且最好不用兩次寫出中間表達式(就像我用_和函數做的那樣),因爲中間表達式可能相當複雜並且有兩次(I意識到我可以將它保存到一個變量並使用它,但這也是不太可讀的)。根據this SE postand
運算符不能被重載,所以我問的是這是否可以完成,然後如何,或者如果我不得不求助於分裂兩個比較(指定中間表達式兩次)。任何建議在正確的方向表示讚賞!謝謝。
可能相關:
編輯: 那麼我現在主要做的是一個linear program寫出的限制,我的代碼,以便相關部門目前是這個樣子:
model.add_constr(a <= b)
model.add_constr(b <= c)
# now i could alter add_constr to support either a tuple or two arguments enabling:
model.add_constr(a <= b, b <= c)
model.add_constr((a <= b, b <= c))
# but most pleasing would be if I could do
model.add_constr(a <= b <= c)
# that would return for example a two tuple that could be interpreted appropriately by
# add_constr()
這聽起來很有希望。我稍後再檢查一下:)。 – karihre
做了一些閱讀,但有點困惑。我將如何「推遲」這些表達式的評估?根據我的理解,我基本上必須通過一個不同的腳本來運行我的python腳本(比如'$ python transform.py original.py'),它會查看腳本源並在評估代碼之前更改AST的腳本?或者將表達式作爲字符串傳遞給「錯誤」解釋它們的函數?我可以忽略一些東西嗎 – karihre
我希望我能回答你所問的問題:你通過AST解釋的表達式必須被引用,或者通過文字引用來評估(「我的表達式」),或者通過轉換整個外部文件。這在Lisp中基本上就像'(quote(stuff ...))'。 「錯誤」解釋的Python代碼不能與其他Python代碼自由混合。我會給我的答案添加一個例子。 –