Я натолкнулся на библиотеку 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
, который периодически связан с самим собой.
Аналогичные механизмы существуют и в операторах +
, *
и @
.Все это поведение задокументировано и ожидается пользователем.
Однако, могут ли произойти какие-то странные вещи, когда вы не думаете, что выражение должно быть оценено - но на самом деле это так - или наоборот?Versa?То есть модель исполнения для Python когда-либо предполагает, что определенные выражения свободны от каких-либо побочных эффектов?Я хочу знать, существует ли какой-либо прецедент или какие-либо особые меры предосторожности должны быть приняты пользователем.