2015-06-24 8 views
5

perche il seguente esempioCome usare sadd con più elementi in Redis usando l'API Python?

>>import redis 
>>redis_db_url = '127.0.0.1' 
>>r = redis.StrictRedis(host = redis_db_url,port = 6379,db = 0) 
>>r.sadd('a',1) 
>>r.sadd('a',2) 
>>r.sadd('a',3) 
>>r.smembers('a') 

[+] uscita: set ([ '1', '3', '2'])

>>r.sadd('a',set([3,4])) 
>>r.smembers('a') 

[+] uscita: set ([ '1', '3', '2', 'impostare ([3, 4])'])

>>r.sadd('a',[3,4]) 
>>r.smember('a') 

[+] set ([ '1', '[3, 4]', ' 3 ',' 2 ',' set ([3, 4]) '])

Secondo t egli documentazione ufficiale in https://redis-py.readthedocs.org/en/latest/ Sadd (nome, * valori) aggiungere valore (s) per impostare nome

Quindi si tratta di un bug o mi manca qualcosa?

risposta

13

Quando si visualizza la sintassi *values in un elenco di argomenti, significa che la funzione accetta un numero variabile di argomenti.

Pertanto, chiamatelo come

r.sadd('a', 1, 2, 3) 

È possibile passare un iterabile utilizzando l'operatore splat per decomprimerlo:

r.sadd('a', *set([3,4])) 
+0

potrei sbagliarmi, ma io non credo che si deve cast come un 'set' prima di disimballare – Seaux

+1

No, non lo fai, ma stavo seguendo l'esempio nella domanda dell'autore. In questo caso la sintassi inline è solo una scorciatoia per indicare che è possibile farlo con un set arbitrario (o in effetti, un iterabile arbitrario). – nneonneo

+1

E in realtà, su qualsiasi recente Python puoi semplicemente fare '* {3, 4}' che è la sintassi nativa per i set letterali, eliminando del tutto il "cast". – nneonneo

1

Si consideri il seguente:

r.sadd('a', 1, 2, 3) 

Questo dovrebbe fare il trucco.