2011-12-13 19 views
1

我想弄清楚如何在多个其他函数中使用Python 3函数(使用非局部变量),而无需再次定义它。这里是我的意思非常简单的例子:在Python中重用内部函数

def inner(airplane): 
    nonlocal var 
    if airplane == "Alpha": 
     var = a 
    elif airplane == "Beta": 
     var = b 
def outer1(airplane): 
    inner(airplane) 
    do stuff with var 
def outer2(airplane) 
    inner(airplane) 
    do other stuff with var 

outer1("FirstAirplane") 
outer2("SecondAirplane") 

我得到一个错误(SyntaxError: No binding for nonlocal 'var' found),但我怀疑我是非常错误的事情了。我不打算自行运行inner()。我如何重用inner()正确的方法?我不能在outer1()里面定义它,然后在outer2()中重新使用它,我可以吗?

好吧,由呃......大众的需求...这里是我的代码中的相关部分...

def planeandoffset(airplane): 
    if airplane == "Zulu": 
     linename = "\\[\\INOV" 
     charoffset = 14 
    elif airplane == "Lima": 
     linename = "\\[\\ILIM" 
     charoffset = 10 
    elif airplane == "Mike": 
     linename = "\\[\\IMIK" 
     charoffset = 10 
    else: 
     print("There is no airplane by that name.") 
    latstart = charoffset 
    latend = 7 + charoffset 
    lonstart = 9 + charoffset 
    lonend = 17 + charoffset 
    return airplane, linename, latstart, latend, lonstart, lonend 

def latlongen(workingline, latstart, latend, lonstart, lonend): 
# Determine Latitude and Longitude in decimal format 
    latraw = workingline[latstart:latend] 
    if latraw[0:1] == "S": 
     pm = "-" 
    else: 
     pm = "" 
    hours = float(latraw[3:5] + "." + latraw[5:]) 
    decimal = hours/60 
    latitude = float(latraw[1:3]) + decimal 
    latitude = float(pm + str(latitude)) 
    lonraw = workingline[lonstart:lonend] 
    if lonraw[0:1] == "W": 
     pm = "-" 
    else: 
     pm = "" 
    hours = float(lonraw[4:6] + "." + lonraw[6:]) 
    decimal = hours/60 
    longitude = float(lonraw[1:4]) + decimal 
    longitude = float(pm + str(longitude)) 
    return latitude, longitude 
def kmlplanegen(airplane): 
    planeandoffset(airplane) 
    global afffilename, iconurl, kmlwrite 
    affread = open(afffilename) 
    while True: 
     line = affread.readline() 
     # Choose appropriate line 
     if line.startswith(linename): 
      workingline = line 
     elif len(line) == 0: # Zero length indicates EOF (Always) 
      break 
     else: 
      pass 
    try: 
     latlongen(workingline, latstart, latend, lonstart, lonend) 
    # Generate kml for Airplane 
     print(''' <Placemark> 
      <Style> 
       <IconStyle> 
        <Icon> 
         <href>{0}</href> 
        </Icon> 
       </IconStyle> 
      </Style> 
      <name>{1}</name> 
      <description>Latitude: {2} Longitude: {3}</description> 
      <Point> 
       <coordinates>{3},{2},0</coordinates> 
      </Point> 
     </Placemark>'''.format(iconurl,airplane,latitude,longitude), file=kmlwrite) 
    except Exception: 
     exit(1, "There was an error. This message is kind of worthless. Stopping Program") 

def kmlpathgen(airplane): 
    planeandoffset(airplane) 
    global afffilename, kmlwrite 
    # Generate kml for Airplane Path 
    print(''' <Style id="yellowLineGreenPoly"> 
     <LineStyle> 
      <color>7f00ffff</color> 
      <width>4</width> 
     </LineStyle> 
     <PolyStyle> 
      <color>7f00ff00</color> 
     </PolyStyle> 
    </Style> 
    <Placemark> 
     <name>{0} Path</name> 
     <description>Transparent green wall with yellow outlines</description> 
     <styleUrl>#yellowLineGreenPoly</styleUrl> 
     <LineString> 
      <extrude>1</extrude> 
      <tessellate>1</tessellate> 
      <altitudeMode>relativeToGround</altitudeMode> 
      <coordinates>'''.format(airplane), file=kmlwrite) 
    try: 
     affread = open(afffilename) 
     while True: 
      line = affread.readline() 
      if len(line) == 0: # Zero length indicates EOF (Always) 
       break 
      elif line.startswith(linename): 
       workingline = line 
       latlongen(workingline, latstart, latend, lonstart, lonend) 
       print("     {0},{1},0".format(longitude,latitude), file=kmlwrite) 
      else: 
       pass 
    except NameError: 
     pass 
    finally: 
     print('''   </coordinates> 
      </LineString> 
     </Placemark>''', file=kmlwrite) 
+0

你需要一个类:)查看:http://docs.python.org/tutorial/classes.html – Crisfole 2011-12-13 20:57:16

+0

[非本地`真正做什么的描述](http://stackoverflow.com/a/ 832391分之1261961)。 – 2011-12-13 21:07:50

回答

3

你刚开始学习编程?

忘掉非本地任何东西。要做到这一点,正确的方法是用return var返回var,再用这个结果在调用上下文分配:

var = inner(airplane) 

编辑:

如果你简单地调用:

planeandoffset(airplane) 

你没有对返回的值做任何事情。要访问它们,请执行以下操作:

airplane, linename, latstart, latend, lonstart, lonend = planeandoffset(airplane) 

我不打算分析你在用这些全局变量做什么,但不管它是什么,停止。可以将这些参数作为函数之间的参数传递,也可以将它们与函数一起放入一个类中,然后将它们作为类的成员进行访问。

无论哪种方式,我建议你按照教程来学习更常用的不使用全局变量的编程风格。