2012-02-21 7 views
6

Estoy buscando una manera más agradable de asignar un conjunto con el contenido de una lista si dicha lista no está vacía, de lo contrario, se debe usar otra lista.Convierta una lista en establecer, pero si está vacía, use una predeterminada

Si es posible me gustaría una manera más agradable de escribir esto (o un argumento de por qué esta es la forma más bonita):

if args.onlyTheseServers: 
    only = set(args.onlyTheseServers) 
else: 
    only = set(availableServers) 
+2

Por favor tener en cuenta que la guía de estilo oficial de Python ([PEP 8] (http://www.python.org/dev/peps/pep-0008/)) no le gusta que llame a su variable o atributos 'onlyTheseServers'; preferiría 'only_these_servers' o tal. –

+1

'is not None' será True si pasa una lista vacía, ¿realmente desea que la condición sea lista vacía o la variable sea None? – Geekfish

+0

@Chris Morgan: ¡Gracias! Lo revisaré y adoptaré. Estoy un poco Java-fied. :-) – Deleted

Respuesta

11
only = set(args.onlyTheseServers or availableServers) 
+0

Eso tiene una semántica ligeramente diferente que la original. Puede o no importar, pero si 'args.onlyTheseServers' es una lista vacía, entonces el original produce un conjunto vacío mientras que su versión usaría el valor predeterminado. – Duncan

+0

Verdadero de hecho. La semántica es diferente de su código de muestra, pero en realidad coincide con el título de la pregunta ("... con el contenido de una lista si la lista no está vacía ..."). –

+0

Tuve un error en mi muestra de código. Así que lo interpretaste como lo quería, a pesar de que mi ejemplo tenía errores. ¡Gracias! – Deleted

0

Llámame loco me gusta comprar esto mejor

only = set(args.onlyTheseServers) if args.onlyTheseServers is not None else set(availableServers) 
+1

Debo llamarte loco por eso. ;-) Pero gracias por responder! Tener un voto cero (votar una respuesta correcta sería cruel). :-) – Deleted

+0

@Kent, jeje. Es porque compro completamente la explicación 'one case is the common one and should be first' en la documentación de pep 308. http://docs.python.org/release/2.5/whatsnew/pep-308.html Entonces lo leíste only = set (args.onlyTheseServers) ... bla bla algún caso especial tratado aquí ... –

1

No hay mucho mejor, pero por lo menos un poco más corto:

only = set(availableServers if args.onlyTheseServers is None 
      else args.onlyTheseServers) 

también se puede hacer

only = set(args.onlyTheseServers or availableServers) 

Funciona ligeramente diferente, ya que no prueba para None, pero solo si el argumento es verdadero, en este caso debería funcionar.

3

En cuanto a su anterior question, yo diría que lo que realmente está buscando es una manera de asignar un valor predeterminado a un parámetro que falta utilizando argparse. En ese caso, debería utilizar sólo default de la siguiente manera:

parser.add_argument('-o', '--only', default=default_servers, ...) 

De esta manera, cuando la opción -o/--only no se pasa, el espacio de nombres tendrá el valor predeterminado ajustado correctamente.

+2

Bien notado. Creo que eso es lo que él quiere. Ahora me molesta que no lo haya pensado yo mismo ... sin haberlo conectado con la pregunta anterior que * había * conectado con argparse debido al nombre de variable 'args'! –

+0

@Chris Morgan: Bueno, soy una pregunta confusa. ¡Lo siento por eso! – Deleted

+0

¡Buena deducción! Lo he resuelto de la manera que sugeriste. Sin embargo, para que mi pregunta aquí "se sostenga por sí misma" (y para posiblemente ayudar a alguien más con ella) estoy marcando la otra como mi respuesta preferida. Aunque se siente un poco mal, si tuviera más votos para dar. :-) – Deleted

2

args.onlyTheseServers parece una variable procedente de argparse.

Si ese es su caso, debe consultar el argumento default y el método set_default().

He aquí un ejemplo:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', nargs='*', default=['1', '2', '3']) 
>>> args = parser.parse_args() 
>>> args.foo 
['1', '2', '3'] 
>>> args = parser.parse_args(['--foo', 'a', 'b']) 
>>> args.foo 
['a', 'b'] 
+0

¡Bonita deducción! Lo he resuelto de la manera que sugeriste. Sin embargo, para que mi pregunta aquí "se sostenga por sí misma" (y para posiblemente ayudar a alguien más con ella) estoy marcando la otra como mi respuesta preferida. Aunque se siente un poco mal, si tuviera más votos para dar. :-) – Deleted

+0

@Kent: No te preocupes :) * (en el futuro si tienes dudas sobre qué respuesta aceptar, [aquí] (http://meta.stackexchange.com/a/5235/177799) hay una referencia)* –

Cuestiones relacionadas