Синтаксическая ошибка мудреца 5.0 с execfile()

следующее является частью файла .sage, который я хотел бы вызвать в сеансе:

def projective_grid(m,n):  
    r"""
    The  mxn grid in projective space
    """
    g = graphs.Grid2dGraph(m,n)
    g = Graph(g)
    for i in range(m):
        g.add_edge(((i,0),(m-i-1,n-1),1))
    for j in [1..(n-2)]:
        g.add_edge(((0,j),(m-1,n-j-1),1))
    g.delete_edge(((0,0),(m-1,n-1)))
    g.add_edge(((0,0),(m-1,n-1),2))
    g.delete_edge(((m-1,0),(0,n-1)))
    g.add_edge(((m-1,0),(0,n-1),2))
    if n%2==1 and m == 2:
        g.delete_edge((0, (n-1)/2), (1, (n-1)/2))
        g.delete_edge((0, (n-1)/2), (1, (n-1)/2))
        g.add_edge((0, (n-1)/2),(1,(n-1)/2),2)
    if n == 2 and m%2==1:
        g.delete_edge(((m-1)/2, 0), ((m-1)/2, 1)) 
        g.delete_edge(((m-1)/2, 0), ((m-1)/2, 1)) 
        g.add_edge(((m-1)/2, 0), ((m-1)/2, 1),2)    
    pos = {}
    k = -1
    for i in [1..m]:
      for j in [1..n]:
        k+=1
        pos[k] = (j,i)
    g.set_pos(pos)
    return g

Я могу скопировать и вставить этот код в сеанс sage без возникновения ошибки, но когда я пытаюсь вызвать файл с помощью execfile(), я получаю следующее:

sage: execfile('/Users/WyattAlt/Desktop/thesis/stack_test.sage')
------------------------------------------------------------
   File "/Users/WyattAlt/Desktop/thesis/stack_test.sage", line 9
     for j in [1..(n-2)]:
                  ^
SyntaxError: invalid syntax

Если я заменю проблемные части на диапазон (1, n-1) и тому подобное, проблема исчезнет, ​​но я хотел бы понять, почему это не работает. Любые идеи? Заранее спасибо.

РЕДАКТИРОВАТЬ: я на OS X 10.5.8


person WKA    schedule 31.01.2013    source источник


Ответы (1)


Синтаксис Sage и синтаксис Python различаются в нескольких местах, в том числе в синтаксисе этого диапазона.

За кулисами консоль Sage подготавливает то, что вы вводите в стандартный Python:

sage: [1..10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sage: preparse('[1..10]')
'(ellipsis_range(Integer(1),Ellipsis,Integer(10)))'

на самом деле даже целые литералы завернуты:

sage: 10
10
sage: preparse('10')
'Integer(10)'

Когда вы используете execfile, чисто функцию Python, вы обходите препарсер Sage. Если вам нужен эквивалент, вы можете использовать load:

sage: !echo "print [1..10]" >> test.sage
sage: !cat test.sage
print [1..10]
sage: execfile("test.sage")
------------------------------------------------------------
   File "test.sage", line 1
     print [1..10]
                ^
SyntaxError: invalid syntax

sage: load("test.sage")
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
person DSM    schedule 31.01.2013
comment
Идеальный. Спасибо за помощь. - person WKA; 01.02.2013
comment
Без проблем. Два момента: (1) не забудьте принять ответы на ваши вопросы, и (2) есть также ask.sagemath.org, который похож на StackOverflow, но только для Sage, и многие разработчики тусуются там. - person DSM; 01.02.2013
comment
+1 на ask.sagemath.org как на первое место, куда можно пойти, но, к счастью, @DSM и некоторые другие из нас иногда бывают здесь :) - person kcrisman; 01.02.2013
comment
В качестве дополнения к этому ответу я настоятельно рекомендую использовать attach вместо load, потому что тогда любые изменения в файле перезагружаются; поскольку Python делает это динамически, если вы по какой-то причине измените projective_grid (например, добавите функциональность) в середине сеанса, вам не придется перезапускать или что-то в этом роде. Я использовал это много в прошлом. - person kcrisman; 01.02.2013
comment
@kcrisman: Я всегда находил attach немного черной магии, приводящей к странным полурабочим состояниям, учитывая то, как я кодирую.. Однако я вижу, как это может быть полезно для других людей. - person DSM; 01.02.2013
comment
@DSM; хорошо, я отзову настоятельно часть. Во всяком случае, это оказывается удобным во многих контекстах. - person kcrisman; 01.02.2013