Я наткнулся на библиотеку Python, которая определяет класс, аналогичный следующему, где оператор >>
перегружен, чтобы иметь глобальный побочный эффект:
from collections import defaultdict
class V(object):
"""A Vertex in a graph."""
graph = defaultdict(list) # accessed globally
def __init__(self, label):
self.label = label
def __rshift__(self, other):
V.graph[self].append(other)
return other
def __repr__(self):
return 'V(%r)' % (self.label,)
Библиотека делает это, потому что «она дает пользователю хороший синтаксис» для символического построения сетей путем записи простых выражений, таких как:
a = V('a')
b = V('b')
c = V('c')
a >> b >> c >> c
чтобы построить сеть, в которой a
соединяется с b
, который соединяется с c
, который рекуррентно соединяется сам с собой.
Подобный механизм есть и у операторов +
, *
и @
. Все это поведение задокументировано и ожидаемо пользователем.
Однако могут ли произойти какие-либо странные вещи, когда вы не думаете, что выражение должно быть вычислено, но на самом деле это происходит, или наоборот? То есть предполагает ли когда-либо модель выполнения для Python, что определенные выражения свободны от каких-либо побочных эффектов? Я хочу знать, есть ли какие-либо прецеденты, или пользователь должен принять какие-либо особые меры предосторожности.