retorno de python – “nombre no definido”

Estoy intentando que esta secuencia de comandos escriba información en un archivo de texto básico. Todavía estoy aprendiendo python.

El problema radica aquí:

file_text = """%s SHOOT DETAILS\n Number of shoots:\t %s Maximum range:\t %s Number of firers:\t %s Number of lanes active:\t %s Number of details:\t %s Troops per detail:\t %s \n RANGE STAFF Ammo NCO:\t %s Medical Supervisor:\t %s IC Butts:\t %s""" % (shoot_name, number_of_shoots, max_range, number_of_firers, number_of_lanes, number_of_details, size_of_details, ammo_nco, medical_supervisor, ic_butts) 

El mensaje de error: NameError: name ‘number_of_details’ no está definido

Lo anterior está (supuestamente) escrito en un archivo con esto:

 def generatedocument(): file = open(file_name, 'w') file.write(file_text) os.startfile(file_name) 

Sin embargo lo definí anteriormente en la siguiente función:

 def detailformation(): number_of_details = number_of_firers / number_of_lanes return number_of_details 

Se producen problemas idénticos para los size_of_details, definidos:

 def detailsizer(): size_of_details = number_of_firers / detailformation() return size_of_details 

Y también con la función de selección de personal de rango, a veces me da un error similar. Vienen de esta función que los selecciona aleatoriamente de una lista:

 def range_staff(): print "\n" ammo_nco = (random.choice(fiveplatoon)) print "Ammo NCO: "+ammo_nco fiveplatoon.remove(ammo_nco) medical_supervisor = (random.choice(fiveplatoon)) print "Medical supervisor: "+medical_supervisor fiveplatoon.remove(medical_supervisor) ic_butts = (random.choice(fiveplatoon)) print "IC Butts/Console: "+ic_butts fiveplatoon.remove(ic_butts) return range_staff 

Parece que me estoy perdiendo algo fundamental aquí. ¿Cómo puedo hacer que Python lo reconozca?

Esto parece un problema de scope . Las variables declaradas dentro de las funciones solo se definen dentro de esa función. Para solucionarlo, coloque la statement de la variable en el mismo ámbito donde se usa. Vea a continuación el código de muestra

 number_of_details = 0 def detailformation(): number_of_details = number_of_firers / number_of_lanes return number_of_details file_text = """%s SHOOT DETAILS\n Number of shoots:\t %s Maximum range:\t %s Number of firers:\t %s Number of lanes active:\t %s Number of details:\t %s Troops per detail:\t %s \n RANGE STAFF Ammo NCO:\t %s Medical Supervisor:\t %s IC Butts:\t %s""" % (shoot_name, number_of_shoots, max_range, number_of_firers, number_of_lanes, number_of_details, size_of_details, ammo_nco, medical_supervisor, ic_butts) 

Tenga en cuenta que esto es solo una solución rápida (poner la variable en el ámbito global).

Las variables solo existen en el ámbito que las declara.

 def fun(): x = 5 return x >>> x Traceback (most recent call last): File "", line 1, in  x NameError: name 'x' is not defined 

Si desea utilizar el valor de return de una función, llame a la función y asígnele una variable de este tipo

 >>> x = fun() >>> x 5 

Llame a sus funciones para obtener el valor que devuelven.

 size_of_details = detailsizer()