El *
símbolo indica tupla desembalaje. Esto puede ser muy útil especialmente cuando usted tiene que llamar a la misma función muchas veces con argumentos diferentes para obtener diferentes partes del objeto devuelto, pero esto se traduce en código repetitivo.
Descripción
Python tiene una poderosa técnica llamada tupla desembalaje donde la tupla de valores de desembalar en los nombres de variable.
(fc_name,fc_type,sr) = ("Roads", "Polyline", 3006)
print(fc_name)
print(fc_type)
print(sr)
Roads
Polyline
3006
Esto puede ser útil cuando la recuperación de las largas secuencias con valores tales como filas de una tabla de base de datos y que necesita para obtener sólo los campos específicos:
row = (2467, 998, 6, 0, u'dirt', u'SSteadman', 20021205, u'Beaver',
(331841.0650, 4129735.250))
ID,road_surface,rest = row[0],row[4],row[5:]
print "ID:",ID
print "Road surface:",road_surface
print "Garbage:",rest
ID: 2467
Road surface: dirt
Garbage: (u'SSteadman', 20021205, u'Beaver', (331841.065, 4129735.25))
Python puro ejemplo de tupla desembalaje
Antes de entrar en arcpy
funciones y tupla desembalaje, vamos a ir a través de un sencillo ejemplo. Vamos a crear una función que va a dejar de hacer algunas operaciones aritméticas en la demanda:
def do_calc(x, y, operation):
if operation == "+":
return x + y
if operation == "-":
return x - y
print do_calc(x=3, y=4, operation='+')
print do_calc(x=3, y=4, operation='-')
7
-1
Los argumentos son almacenados en una tupla:
input_args = (5, 8, '+')
#instead of accessing individual items within a tuple and matching the arguments order
print do_calc(x=input_args[0],y=input_args[1],operation=input_args[2])
#unpacking tuple, so every item in the tuple gets assigned to an input argument in order
print do_calc(*input_args)
Tupla de descompresión de arcpy
operaciones
Aquí hay otro ejemplo de desembalaje de una secuencia dentro de los argumentos a la hora de construir arcpy.Point
objetos de una lista de coordenadas:
import arcpy
coords_pairs = [[14.45, 25.65, 567],
[24.23, 46.56, 580],
[34.89, 74.23, 593]]
#input data for Point ({X}, {Y}, {Z})
#instead of [arcpy.Point(c[0],c[1],c[2]) for c in coords_pairs]
points = [arcpy.Point(*coords) for coords in coords_pairs]
print(points)
[<Point (14.45, 25.65, 567.0, #)>,
<Point (24.23, 46.56, 580.0, #)>,
<Point (34.89, 74.23, 593.0, #)>]
El uso avanzado de la tupla de descompresión de arcpy
Desembalaje de tuplas puede ser una técnica muy eficaz cuando se trabaja con funciones que pueden aceptar iterables de longitud arbitraria. Vamos a crear un flujo de trabajo que nos permitirá añadir varios campos en una clase de entidad sin escribir arcpy.AddField_management()
línea para cada campo.
import arcpy
input_fc = 'cities'
#(name,type,{precision},{scale},{length},{alias},{is_nullable},{is_required},{domain})
fields = [("ref_ID","LONG",9,"","","refcode","NULLABLE","NON_REQUIRED"),
("DataSet_ID","LONG",5,"","","datacode","NULLABLE","NON_REQUIRED"),
("Recomment","TEXT","","","35","recordcomment","NULLABLE","NON_REQUIRED")]
#adding each field in the list unpacking the tuple
for field_tuple in fields:
arcpy.AddField_management(*(input_fc,) + field_tuple)
Hay otro post en el SIG.SE muestra el uso de la tupla desembalaje para añadir campos, útil revisar.