2014-12-27 13 views
7

La seguente funzione restituisce None:Cosa sta facendo None nell'attributo co_consts dell'oggetto codice?

In [5]: def f(): 
    ...:  pass 

Quindi non mi ha sorpreso per questa uscita:

In [8]: dis.dis(f) 
    2   0 LOAD_CONST    0 (None) 
       3 RETURN_VALUE   

In [10]: f.__code__.co_consts 
Out[10]: (None,) 

Ok, questo ha un senso. Ma ora, si consideri la seguente funzione:

In [11]: def g(): 
    ....:  return 1 

In [12]: dis.dis(g) 
    2   0 LOAD_CONST    1 (1) 
       3 RETURN_VALUE   

In [13]: g.__code__.co_consts 
Out[13]: (None, 1) 

g non usa None, quindi perché è a co_consts?

risposta

7

Il valore di ritorno predefinito per una funzione è None, quindi è sempre inserito. Python non vuole dover analizzare se si è sempre andando a raggiungere una dichiarazione di ritorno.

Si consideri ad esempio:

def foo(): 
    if True == False: 
     return 1 

La funzione di cui sopra restituirà None, ma solo perché l'istruzione if non è mai sta per essere True.

Nel tuo caso semplice, per noi umani è ovvio che esiste solo l'opcode RETURN_VALUE, ma estendere questo caso generale a un computer per rilevare non vale la pena. Meglio solo memorizzare il riferimento None ed essere fatto con esso, quel riferimento è estremamente economico.

Problemi correlati