2012-02-21 6 views
6

Poszukuję lepszego sposobu na przypisanie zestawu z dodaną listą, jeśli lista nie jest pusta, w przeciwnym razie należy użyć innej listy.Konwertuj jedną listę do ustawienia, ale jeśli jest pusta, użyj domyślnej wartości

Jeśli to możliwe chciałbym ładniejszy sposób napisać (lub argument dlaczego to najpiękniejszy sposób):

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

Należy pamiętać, że przewodnik oficjalny styl Python ([PEP 8] (http://www.python.org/dev/peps/pep-0008/)) nie podoba ci się wywoływanie zmiennej lub atrybutów 'onlyThesevers'; wolałby 'only_these_servers' lub coś podobnego. –

+1

'is not None' będzie prawdziwe, jeśli przekażesz pustą listę, czy rzeczywiście chcesz, aby warunek był pustą listą lub zmienna była None? – Geekfish

+0

@Chris Morgan: Dzięki! Przejrzę to i przyjmuję. Jestem trochę Java-fied. :-) – Deleted

Odpowiedz

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

To ma nieco inną semantykę niż oryginał. Może to, ale nie musi, ale jeśli 'args.onlyTheseServers' jest pustą listą, to oryginał tworzy pusty zbiór, podczas gdy twoja wersja używałaby domyślnego. – Duncan

+0

To prawda. Semantyka różni się od jego przykładowego kodu, ale faktycznie pasuje do tytułu pytania ("... z treścią listy, jeśli lista nie jest pusta ..."). –

+0

Mam błąd w moim przykładzie kodu. Zinterpretowałeś to tak, jak tego chciałem, mimo że mój przykład to buggy. Dzięki! – Deleted

0

Zadzwoń do mnie do szału kupna Lubię to lepiej

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

Będę musiał nazywać cię szalonym na tym. ;-) Ale dzięki za odpowiedź! Mieć zero głosów (głosowanie na poprawną odpowiedź byłoby okrutne). :-) – Deleted

+0

@Kent, hehe. To dlatego, że całkowicie kupuję "jeden przypadek jest powszechny i ​​powinien być pierwszym" wyjaśnienie podane w dokumentacji pep 308. http://docs.python.org/release/2.5/whatsnew/pep-308.html Czytasz to tylko = set (args.onlyTheseServers) ... bla bla jakiś specjalny przypadek traktowany tutaj ... –

1

Nie naprawdę dużo lepiej, ale przynajmniej nieco krótszy:

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

można również zrobić

only = set(args.onlyTheseServers or availableServers) 

Działa nieco inaczej, ponieważ nie testuje dla None, ale tylko jeśli argument jest prawdziwy - jest - w tym przypadku powinien działać.

3

Patrząc na poprzedniej question, powiedziałbym, że to, czego naprawdę szukasz jest sposób, aby przypisać wartość domyślną dla brakującego parametru używając argparse. W takim przypadku należy po prostu użyć default następująco:

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

W ten sposób, gdy opcja -o/--only nie jest przekazywana, przestrzeń nazw będzie miała wartość domyślna ustawione poprawnie.

+2

Dobrze zauważyłem. Myślę, że właśnie tego chce. Jestem teraz zirytowany, że sam o tym nie myślałem ... bez połączenia go z poprzednim pytaniem, które * miałem * połączył z argparse ze względu na nazwę zmiennej 'args'! –

+0

@Chris Morgan: Cóż, jestem mylącym pytającym. Przepraszam za to! – Deleted

+0

Niezłe odliczenie! Rozwiązałem to tak, jak zasugerowałeś. Jednakże, aby moje pytanie tutaj "stanąć na własną rękę" (i ewentualnie pomóc komuś innemu z nim), zaznaczam drugą jako moją preferowaną odpowiedź. Chociaż wydaje mi się to trochę złe, gdybym tylko miał więcej głosów do zdobycia. :-) – Deleted

2

args.onlyTheseServers wydaje się być zmienną pochodzącą z argparse.

W takim przypadku należy sprawdzić argument default i metodę set_default().

Oto przykład:

>>> 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

Dobra dedukcja! Rozwiązałem to tak, jak zasugerowałeś. Jednakże, aby moje pytanie tutaj "stanąć na własną rękę" (i ewentualnie pomóc komuś innemu z nim), zaznaczam drugą jako moją preferowaną odpowiedź. Chociaż wydaje mi się to trochę złe, gdybym tylko miał więcej głosów do zdobycia. :-) – Deleted

+0

@Kent: Nie martw się o to :) * (w przyszłości, jeśli masz wątpliwości, na którą odpowiedź przyjąć, [tutaj] (http://meta.stackexchange.com/a/5235/177799) jest referencja)* –

Powiązane problemy