2012-03-01 12 views
6

Tengo una función de Python que requiere una serie de parámetros, uno de los cuales es el tipo de simulación que se debe realizar. Por ejemplo, las opciones podrían ser "vista" "solar" o "tantoManera pitónica de tener una opción de 2-3 opciones como argumento para una función

¿Cuál es una manera Pythonic para permitir al usuario configurar estos

puedo ver varias opciones:.?

  1. utilice una variable de cadena y comprobar que - por lo que sería func(a, b, c, type='solar')

  2. establecer algunas constantes de la clase y utilizar func(a, b, c, type=classname.SOLAR)

  3. Si solo hay dos opciones (como las hay para algunas de mis funciones) forzarla a un argumento True/False, usando algo como func(a, b, c, do_solar=False) para que use la opción 'ver'.

¿Alguna preferencia (u otras ideas) para las formas Pythonic de hacer esto?

+2

No use 'type' como su nombre de argumento, ya que es un built-in ... Estoy –

Respuesta

3

No me gusta ninguna de esas opciones.

Definiría dos funciones diferentes, perform_solar(a, b, c) y perform_view(a, b, c) y dejaré que el que llama decida cuáles quiere usar, en qué orden y con qué argumentos.

Si el motivo por el que pensó que debería empaquetarlos en una sola función es que comparten estado, debe compartir ese estado en un objeto y definir las funciones como métodos.

1

Puede utilizar argumentos opcionales (palabra clave) como esto

def func(a, b, c, **kw): 
    if kw.get('do_solar'): 
     # Do Solar 
    if kw.get('do_view'): 
     # Do view 
3

Si el punto de Niklas hace en his answer no se sostiene, me gustaría utilizar un argumento de cadena. Hay módulos de Python en la biblioteca estándar que usan argumentos similares. Por ejemplo csv.reader().

sim_func(a, b, c, sim_type='solar') 

Recuerde proporcionar un error razonable dentro de la función, que ayuda a las personas si escriben algo incorrecto.

def sim_func(a, b, c, sim_type='solar'): 
    sim_types = ['solar', 'view', 'both'] 
    if sim_type not in sim_types: 
     raise ValueError("Invalid sim type. Expected one of: %s" % sim_types) 
    ... 
2

Dado que las funciones son objetos en Python, en realidad se podría procesar * args como una lista de métodos y pasan los tipos de simulaciones como arbitratry args al final. Esto tendría el beneficio de permitirle definir nuevas simulaciones en el futuro sin tener que refactorizar este código.

def func(a, b, c, *args): 
    for arg in args: 
     arg(a, b, c) 

def foosim(a, b, c): 
    print 'foosim %d' % (a + b + c) 

def barsim(a, b, c): 
    print 'barsim %d' % (a * b * c) 

Uso:

func(2, 2, 3, foosim) 
func(2, 2, 3, barsim) 
func(2, 2, 3, foosim, barsim) 

Salida:

foosim 7 
barsim 12 
foosim 7 
barsim 12 
+0

ningún abogado de idiomas, pero he visto este enfoque en buen código. Requiere que sus simulaciones sean funciones separadas, lo cual es una buena idea de todos modos: las buenas convenciones fomentan una buena programación. – alexis

Cuestiones relacionadas