2013-04-17 3 views
1

У меня есть функция и настройка маршрута колбы. Однако, когда я перехожу к «простой странице», я получаю сообщение об ошибке «NameError: глобальное имя« aaa »не определено». Почему ни один из объектов, передаваемых в testfun? Это что-то из-за декоратора app.route или из-за колбы? Могу ли я передать все объекты, переданные в testfun? Мой фактический код намного сложнее с большим количеством объектов, которые нужно будет передать, но этот упрощенный сценарий был создан для иллюстрации моей проблемы.объекты, которые не передаются в функцию в колбе маршрута

def testfun(): 
    b=aaa 

@app.route("/simplepage/", methods=['GET']) 
def simplepage(): 
    aaa=1 
    testfun() 
    return flask.render_template('page.html') 
+0

Почему бы не передать 'aaa' в качестве аргумента' testfun() '(т.е.' testfun (ааа) ') – John

+0

хорошо, в моем реальном приложении есть намного больше объектов, чтобы пройти и я бы также для повторного импорта большого количества модулей, и сделать это для нескольких функций. я бы предпочел избежать всего этого и сделать код более чистым и более простым в обслуживании. Я не думаю, что у меня обычно есть эта проблема. – user1748155

+0

После небольшого исследования я уверен, что это проблема [scoping] (http://stackoverflow.com/a/292502/322909) ... – John

ответ

1

В основном то, что происходит это

def t(): 
    print aaa 

def s(): 
    aaa = "hi" 
    t() 

s() 

Python ищет aaa сначала в локальной области, то в любой функции оберточной областей, а затем по всему миру, и, наконец, в встроенных команд. Поскольку область функций s не является одной из тех вещей, которые python выбрасывает неопределенную ошибку, поскольку она не может найти aaa.

Одним из решений было бы объявить aaa глобальным.

def t(): 
    print aaa 

def s(): 
    global aaa 
    aaa = "hi" 
    t() 

s() 
+0

Я предполагаю, что путаница в том, что объект должен быть определен там, где вызывается или определяется функция самого верхнего уровня, но любые вспомогательные функции только передают объекты, переданные им с уровня, на котором они были определены, а не там, где они вызываются. – user1748155

+0

Следующий делает работу: – user1748155

+0

DEF с(): Защиту т(): печати aaà ааа = "привет" т() s() – user1748155

3

Это связано с Python's scoping rules (как @johnthexiii указал) - testfun->aaa связан с глобальной областью действия, поскольку не существует переменная с именем aaa объявлена ​​в любом месте внутри testfun и не заключая сфера (т.е. testfun не объявляется внутри другой функции или класса).

Вы хотите передать aaa в качестве аргумента testfun:

testfun(aaa) 

Если testfun требует слишком много Params Есть несколько способов, вы можете высыхают код:

  • Используйте несколько функций: Если testfun выполняет большую работу, то разбить его на несколько функций, которые возвращают промежуточные преобразования данных:

    def start_test(arg1, arg2, arg3): 
        # do stuff with args 
        return result_stage_1 
    
    def continue_test(arg3, arg4, arg5): 
        # do stuff with args 
        return result_stage_2 
    
    def finalize_test(arg7, arg8): 
        # do stuff with args 
        return real_result 
    
  • аргументы Используйте ключевое слово: Если переменное число аргументов, необходимо и testfunне разбиваться вы можете использовать именованные аргументы для упрощения вызова функции:

    def testfun(arg1=None, arg2=None, arg3=None, arg4=None, 
           arg5=None, arg6=None, arg7=None, arg8=None): 
        # do stuff with args 
    
    # call it as so 
    args = {"arg1": "some args", "arg5": "have defaults"} 
    if complex_condition: 
        args["arg3"] = 17 
    elif another_condition: 
        args["arg7"] = 10 
    
    testfun(**args) 
    
  • Инкапсулировать состояние и поведение с помощью классов (или замыканий): Если ни одно из вышеперечисленных действий не будет работать для вас, вам, вероятно, придется покинуть область функций без состояния и создать e классы или функции закрытия, чтобы сохранить ваше состояние и позволить вам изменять поведение по мере необходимости.

Смежные вопросы