Это не очень хорошая идея.(Это прямо на границе между ответом и комментарием, но я хотел привести примеры, которые трудно втиснуть в комментарий.)
Файл .sage либо содержит специфический для Sage синтаксис и поведение, либо нет.Если это не так, вы можете просто переименовать его в .py, или сделать символическую ссылку, или что-то еще.Но если это произойдет, то вам все равно придется его предварительно проанализировать, прежде чем он будет работать в Python.
Например, если файл "functions.sage" пишет:
x = 2/3
если вы загрузите файл в sage, вы получите элемент QQ:
sage: x
2/3
sage: parent(x)
Rational Field
, но в Python 2 вы просто получите int (0).
Он может использоватьДиапазоны в стиле Sage:
sage: [1,3,..,11]
[1, 3, 5, 7, 9, 11]
или другие возможности Sage:
sage: F.<x,y> = GF(2)[]
sage: F
Multivariate Polynomial Ring in x, y over Finite Field of size 2
, и все они обрабатываются подготовителем Sage, а не Python.За кулисами он делает это:
sage: preparse("F.<x,y> = GF(2)[]")
"F = GF(Integer(2))['x, y']; (x, y,) = F._first_ngens(2)"
ОБНОВЛЕНИЕ: По-видимому, я не прояснил проблему достаточно.
sage: import imp
sage: !cat functions.sage
x = 2/3
sage: functions = imp.new_module("functions")
sage: execfile("functions.sage", vars(functions))
sage: dir(functions)
['__builtins__', '__doc__', '__name__', '__package__', 'x']
sage: functions.x
0
sage: type(functions.x)
<type 'int'>
Так или иначе, вы будете иметьпередать функции.sage через препарсер.