2013-05-23 1 views
0

У меня есть нормально структурированная программа Python с операторами импорта, определениями классов, другими подпрограммами и некоторыми «главными» операторами, которые вызывают методы в классах (в этом порядке). операторы печати после импорта печатает «ОК»Порядок выполнения Python-модуля

Python 2.7.2

Я получаю NameError в методе класса.

print >> common, ... 

NameError: 'common' is not defined 

common используется ранее в том же способе, но более ранние ссылки не повод без ошибок.

common используется во многих методах - перемещение этого метода физически не оказывает никакого эффекта: ошибка по-прежнему находится на одной линии в этом методе.

Ошибка возникает до метод вызывается и перед выполнением любого из «основных» операторов. Помещение возврата в качестве первого исполняемого оператора в методе не имеет никакого эффекта. Это все, по-видимому, происходит во время определения класса.

Если я прокомментирую инструкции print >> common, я получаю другой NameError в том же методе.

Я понятия не имею, как я могу получить NameError внутри метода в 'время определения'.

Любые идеи? Этот метод приведен ниже:

x = z ** 2 ниже Предполагаемый для создания NameError: нет z. Операция печати сразу после того, как все определения функций не выполняются.

"""code below""" 
@classmethod 
    def show_role_map(cls): 
     """show jobs within roles, with total days, with percents of totals""" 

     return 
     raise ZeroDivisionError 
     return 

     print >> common, "xyzzy" 

     x = z ** 2 

     p  = Performance("Traveler: show_role_map") 
     print "\tshow_role_map" 
     roles = cls.role_map.keys() 
     roles.sort() 
     header ("Qualitative Role Map") 

     role_totals = collections.defaultdict(float) 
     job_totals = collections.defaultdict(float) 

     for name in Traveler.roster: 
      trav = Traveler.roster[name] 
      for day in trav.roles: 
       frac = 1.0/len(trav.roles[day]) 
       for role in trav.roles[day]: 
        role_totals[role] += frac 
      for day in trav.jobs: 
       frac = 1.0/len(trav.jobs[day]) 
       for job in trav.jobs[day]: 
        job_totals[job] += frac 

     role_total = sum(role_totals.values()) 
     job_total = sum(job_totals.values()) 
     assert abs(role_total - job_total) <= 1e-6 

     print >> common, "Total Role days =", role_total 
     print >> common, "Total Job days =", job_total 
     print >> common 


     for role in roles: 
      if role_totals[role] == 0: continue 
      print >> common, "\t%12s %51.1f %12s %12.3f" %\ 
       (role, role_totals[role], \ 
       "", 100.0 * role_totals[role]/role_total) 

      jobs = list(cls.role_map[role]) 
      jobs.sort (key = lambda x: (job_totals[x], x), reverse = True) 

      for index, job in enumerate(jobs, 1): 
       if job_totals[job] == 0: continue 
       print role, job, role_totals[role], job_totals[job] 
       print >> common, "\t\t%6d. %35s %12.1f % 12.3f %12.3f" % \ 
        (index, job, job_totals[job], \ 
       100.0 * job_totals[job]/role_totals[role], 
       100.0 * job_totals[job]/role_total) 
      print >> common 


    print >> common, "\n", "_" * 60, "\n" #--ERROR OCCURS FOR THIS LINE **************** 
    print >> common, "\nRoles in Total Tripday order\n" 
    roles = role_totals.keys() 
    roles.sort (order = lambda x: (role_totals[x], x), reverse = True) 
    for index, role, in enumerate(roles,1): 
     print >> common, "%6d. %15s %12.1f %12.3f" % \ 
      (index, role, role_totals[role], \ 
      100.0 * role_totals[role]/role_total) 

    print >> common, "\n", "_" * 60, "\n" 
    print >> common, "\nDetailed Trip Roles in Total Tripday order" 
    jobs = job_totals.keys() 
    jobs.sort (key = lambda x: (job_totals[x], x), reverse = True) 
    for index, job in jobs: 
     print >> common, "%6d. %35s %12.1f %12.3f" % \ 
      (index, job, job_totals[job], 100.0 * job_totals[job]/job_total) 


    p.close() 
+3

Я понимаю вопрос. Но без какого-либо кода очень сложно сказать, где ваш код отличается от того, что вы ожидаете. Отправьте свой код – inspectorG4dget

+0

Пожалуйста, включите весь сегмент (метод) кода, с которым вы столкнулись. –

+0

Не стесняйтесь, если вы не разместите свой код.Кроме того, вы можете рассказать нам, какую версию используемого python вы используете (хотя это не обязательно нужно некоторое время). – inspectorG4dget

ответ

1

Итак, сначала первое. Когда вы определяете функцию, функция не выполняется. В пространстве имен указано только имя. Только когда функция вызывается (она вызвана), действительно ли она выполняет код внутри функции (это верно, если у вас нет синтаксических ошибок).

Таким образом, интерпретатор обрабатывает ваши импорт и т. Д. (Вверху файла), а затем замечает, что у вас есть функция (поэтому она отмечает свое имя) и продолжает выполнение остальной части кода (материал после определения функции). Именно в этот момент он видит print >> common. Поскольку common не находится в стеке памяти (он никогда не был определен ранее), интерпретатор не знает, каково его значение и поэтому вызывает NameError.

Обратите внимание, что это все равно произойдет, когда вы вызовете свою функцию, так как она также использует common, прежде чем она будет определена.

Надеюсь, что это поможет

+0

У меня нет синтаксических ошибок. – Gerry

+0

Есть еще 30 других методов, определенных до этого, что все print >> common – Gerry

+0

не имеет значения, сколько методов существует до этого, которые печатают 'common'. Каждая функция имеет свой собственный «общий» в своей области. Таким образом, эти общие определения не влияют на это. Если это то, к чему вы стремитесь, возможно, вам нужна глобальная переменная или член данных ('self.common'). – inspectorG4dget

0

Ошибка с отступлением. Оператор проблемы не был отступом внутри своей функции и, как представляется, был Python как оператор, который должен выполняться во время определения класса.

Спасибо всем, кто пытался помочь.