2015-12-14 7 views
5
def test_stats(team, *args): 

    if not args: 
      [do some stuff] 
    else: 

     team_fixtures = (Fixtures.objects.filter(home_team=team_details.id) | Fixtures.objects.filter(away_team=team_details.id))/ 
.filter(fixture_datetime__lt=datetime.now()).filter(fixture_datetime__year=args[0]) 

E per l'amor di riferimento - args è:args pitone non funziona a meno che non ha un riferimento di posizione

date_year = datetime.now().year 

per questa query a lavorare ho bisogno di fare riferimento args come

.filter(fixture_datetime__year=args[0]) 

perché se uso

.filter(fixture_datetime__year=args) 

Ho ricevuto l'errore:

int() argument must be a string, a bytes-like object or a number, not 'tuple'

Capisco che pensa che sia una tupla anche se è solo un valore, ma quando lo faccio la seguente nel terminale

type(date_year) 

ottengo classe indietro.

Perché devo fare riferimento alla posizione qui quando sembra essere un solo valore di ritorno?

+1

'* args' è * sempre * una tupla. –

+0

Non capisco cosa stai chiedendo. Sembra che tu risponda già a tutte le tue domande. Se fornisci esattamente un argomento 'bar' a' foo (* args) 'allora' args == (bar,) '. Ma leggendo il tuo post lo sapevi già. – timgeb

+1

@timegb L'OP si chiede perché se passa 'date_year' nella chiamata alla funzione, perché viene passato come una tupla di lunghezza 1, invece del numero intero. –

risposta

4

L'argomento * -prefixed è sempre una tupla. Cattura 0 o più argomenti posizionali extra. È possibile chiamare la funzione test_stats() con 3 o 20 o 100 argomenti extra (oltre il team argomento esplicito), e tutti avrebbero fatto parte del args tuple nella funzione:

>>> def foo(*args): return args 
... 
>>> foo() 
() 
>>> foo(42) 
(42,) 
>>> foo(1, 2, 3) 
(1, 2, 3) 

Se si voleva uno opzionale argomento, ne fanno un argomento parola chiave con un default sentinella, come None:

def test_stats(team, optional=None): 
    if optional is None: 
     # ... 
    else: 
     team_fixtures = (
      Fixtures.objects.filter(home_team=team_details.id) | 
      Fixtures.objects.filter(away_team=team_details.id)) 
       .filter(fixture_datetime__lt=datetime.now()) 
       .filter(fixture_datetime__year=optional) 
     ) 
+0

Potrebbe valere ancora la pena di ricordare che 'pippo (1)' restituire '(1,)'. Nel caso in cui qualcuno pensi che un singolo argomento sia un'eccezione. – SuperBiasedMan

+1

@SuperBiasedMan: fatto, usando il mio intero preferito. –

1

Se si sa che si sta ricevendo data come un secondo argomento quindi definire in modo esplicito nella firma

def test_stats(team, date): 

Se riesci a passare c'è anche qualcosa di diverso quindi utilizzare argomenti chiave

def test_stats(team, date=None, something_else=None): 

*args deve essere utilizzato solo se si desidera passare sequenza di argomenti senza creare una sequenza di anticipo

def get_integers(*args): 
    return args 


>>> get_integers(1, 3, 4, 8, 9, 11) 
(1, 3, 4, 8, 9, 11) 

*args è una tupla e **kwargs è un dizionario.

Problemi correlati