2013-05-23 3 views
0

필자는 import 문, 클래스 정의, 다른 루틴 및 클래스의 메서드를 호출하는 "main"문을 순서대로 사용하여 일반적으로 구조화 된 Python 프로그램을 사용합니다. 수입 후 인쇄 문은파이썬 모듈 실행 순서

파이썬 2.7.2

내가 클래스 메소드에 나가서 설명하자면 NameError을 얻고있다 "OK"를 인쇄합니다.

print >> common, ... 

NameError: 'common' is not defined 

common

는 동일한 방법으로 이전에 사용하지만, 이전의 참조 오류를 야기되지 않습니다.

common이 많은 방법에 사용됩니다.이 방법을 물리적으로 움직이는 것은 효과가 없습니다.이 방법에서는 오류가 여전히 같은 줄에 있습니다.

전에 전에 오류가 발생하고 "main"문이 실행되기 전에 오류가 발생합니다. 메서드에서 return을 첫 번째 실행 문으로 사용하는 것은 효과가 없습니다. 이것은 클래스 정의 시간에 모두 분명히 발생합니다.

print >> common 문을 주석 처리하면 동일한 메서드에서 다른 NameError가 발생합니다.

'정의 시간'에 메서드 내에서 NameError를 어떻게 얻을 수 있는지 알 수 없습니다.

아이디어가 있으십니까? 방법은 다음과 같습니다.

x = z ** 2는 입니다.은 NameError를 생성합니다. z는 없습니다. 모든 함수 정의가 실행 된 직후에 print 문이 실행되지 않습니다.

"""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

코드를 게시하지 않고도 결과를 기대하지 마십시오.또한 사용중인 파이썬의 버전을 알려주고 싶을 수도 있습니다 (잠시 필요하지는 않지만). – inspectorG4dget

답변

1

그래서 처음으로 먼저. 함수를 정의 할 때 함수는 실행되지 않습니다. 네임 스페이스에는 이름 만 표시됩니다. 함수가 호출 될 때만 (즉, 호출 된 경우) 실제로 함수 내에서 코드가 실행됩니까 (구문 오류가 없다고 가정하면 true).

그래서 인터프리터는 가져 오기 등을 (파일의 맨 위에) 처리 한 다음 함수가 있음을 알아 차리고 (따라서 이름을 기록함) 나머지 코드를 계속 실행합니다 (함수 정의 이후의 내용). 이 시점에서 그것은 print >> common입니다. common이 메모리 스택에 없으므로 (이전에 정의 된 적이 없었 음) 해석기는 그 값이 무엇인지 모르기 때문에 NameError을 발생시킵니다.

함수를 호출 할 때 여전히 발생하며 정의되기 전에 common을 사용하기 때문에 발생합니다.

희망합니다.

+0

구문 오류가 없습니다. – Gerry

+0

이 전에 정의 된 30 가지 이상의 다른 방법이 있습니다. 모든 것이 공통적으로 인쇄됩니다. >> common – Gerry

+0

'common'을 인쇄하기 전에 얼마나 많은 메서드가 있는지는 중요하지 않습니다. 각 함수는 그 범위 내에서 자신의'common'을가집니다. 따라서 공통의 정의는이 것에 영향을주지 않습니다. 그게 당신이 목표로한다면, 아마도 당신은 글로벌 변수 나 데이터 멤버 (self.common)를 원할 것입니다. – inspectorG4dget

0

들여 쓰기 오류. 문제 문장은 함수 내에서 들여 쓰기가되지 않아 클래스 정의 시간에 실행될 문으로 Python으로 보였다.

도움을 주신 모든 분들께 감사드립니다.