Я не верю, что для этого есть очень хорошая поддержка, но вы можете попробовать что-то вроде
import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid
delta = 0.025
xrange = arange(-5.0, 20.0, delta)
yrange = arange(-5.0, 20.0, delta)
X, Y = meshgrid(xrange,yrange)
# F is one side of the equation, G is the other
F = Y**X
G = X**Y
matplotlib.pyplot.contour(X, Y, (F - G), [0])
matplotlib.pyplot.show()
См. API docs для contour
: если четвертый Аргумент - это последовательность, затем он указывает, какие контурные линии будут отображаться. Но сюжет будет только так хорош, как разрешение ваших диапазонов, и есть определенные возможности, которые он может никогда не получить правильно, часто в точках самопересечения.
Я обычно использую функциональные атрибуты в качестве устройства хранения данных для аннотаций. Предположим, что я хочу записать в стиле C# (указание, что определенный метод должен быть частью интерфейса веб-сервиса)
class Foo(WebService):
@webmethod
def bar(self, arg1, arg2):
...
тогда, я могу определить
def webmethod(func):
func.is_webmethod = True
return func
Затем когда вызов веб-сервиса прибывает, я ищу метод, проверяю, имеет ли базовая функция атрибут is_webmethod (фактическое значение не важно), и откажитесь от сервиса, если метод отсутствует или не предназначенный, чтобы быть вызванным сеть.
Я использовал их в качестве статических переменных для функции. Например, учитывая следующий код C:
int fn(int i)
{
static f = 1;
f += i;
return f;
}
я могу реализовать функцию так же в Python:
def fn(i):
fn.f += i
return fn.f
fn.f = 1
Это определенно попало бы в конец "злоупотреблений" спектра.
Функциональные атрибуты могут использоваться для записи легких закрытий, которые обертывают код и связанные данные вместе:
#!/usr/bin/env python
SW_DELTA = 0
SW_MARK = 1
SW_BASE = 2
def stopwatch():
import time
def _sw( action = SW_DELTA ):
if action == SW_DELTA:
return time.time() - _sw._time
elif action == SW_MARK:
_sw._time = time.time()
return _sw._time
elif action == SW_BASE:
return _sw._time
else:
raise NotImplementedError
_sw._time = time.time() # time of creation
return _sw
# test code
sw=stopwatch()
sw2=stopwatch()
import os
os.system("sleep 1")
print sw() # defaults to "SW_DELTA"
sw( SW_MARK )
os.system("sleep 2")
print sw()
print sw2()
1.00934004784
2.00644397736
3.01593494415
Можно сделать, возражает JavaScript путь... Это не имеет никакого смысла, но это работает;)
>>> def FakeObject():
... def test():
... print "foo"
... FakeObject.test = test
... return FakeObject
>>> x = FakeObject()
>>> x.test()
foo
Иногда я уже использую атрибут функции для кэширования вычисленных значений. У Вас может также быть универсальный декоратор, который обобщает этот подход. Знайте о проблемах параллелизма и побочных эффектах таких функций!
Я всегда имел предположение, что единственная причина, это было возможно, состояла в том, таким образом, было логическое место для помещения строки документа или другого такого материала. Я знаю, использовал ли я его для какого-либо производственного кода, это перепутало бы больше всего, кто считал его.
Я использую их редко, но они могут быть довольно удобными:
def log(msg):
log.logfile.write(msg)
Теперь я могу использовать log
во всем моем модуле и перенаправлять вывод, просто установив log .logfile
. Есть много-много других способов добиться этого, но этот легкий и очень простой. И хотя в первый раз это было забавно пахнуть, я пришел к выводу, что это пахнет лучше, чем наличие переменной глобального файла журнала
.