2017-12-12 4 views
4

Ich habe einige Tests gemacht:Warum funktionieren einige Operatoren nicht wie erwartet mit Recordsets in Odoo?

>>> empty_recordset = self.env['res.users']         # empty recordset 
>>> not_empty_recordset = self.env['res.users'].search([('id', '=', 1)]) # recordset with one record 

>>> empty_recordset is False 
False 

>>> empty_recordset is None 
False 

>>> empty_recordset == False 
False 

>>> empty_recordset == True 
False 

>>> bool(empty_recordset) 
False 

>>> not empty_recordset 
True 

>>> if empty_recordset:   # it is treated as False 
...  print('hello') 
... 

>>> bool(not_empty_recordset) 
True 

>>> if not_empty_recordset: 
...  print('hello') 
... 
hello 

>>> not not_empty_recordset 
False 
  • Wenn der Re-Cord mit bool() gegossen wird, kehrt True oder False.
  • Mit if und not Aussagen ist das Ergebnis auch das erwartete.
  • Aber wenn es mit den Operatoren is, ==, != verwendet wird, ist das Ergebnis nicht das erwartete.

Was passiert? Wird das Recordset nur mit den Anweisungen if und not als boolescher Wert behandelt? Sind die übrigen Bediener nicht überlastet?

Antwort

2

Es ist die Art und Weise __nonzero__ implementiert:

aufgerufen, um Wahrheitswert Testen und den integrierten Betrieb bool() umzusetzen; sollte False oder True oder ihre Ganzzahläquivalente 0 oder 1 zurückgeben. Wenn diese Methode nicht definiert ist, wird len() aufgerufen, wenn sie definiert ist, und das Objekt wird als wahr betrachtet, wenn das Ergebnis ungleich Null ist. Wenn eine Klasse weder len() noch nonzero() definiert, werden alle ihre Instanzen als wahr betrachtet.

Sie können es auf odoo/odoo/models.py überprüfen:

Für Odoo 10 ist der Code:

def __nonzero__(self): 
    """ Test whether ``self`` is nonempty. """ 
    return bool(getattr(self, '_ids', True)) 
3

Neben Lucas Antwort, die alle zu erklären. in Python sind alle Operation Methode umgewandelt ruft

 if object: 
     # is turned to. 
     if object.__nonzero__(): 

Und

 if object == value: 
     #is turned to 
     if object.__eq__(value): 

auch dies:

 object + value 
     # is converted go this 
     object.__add__(value) 

Alle Betreiber gab es passende Methoden.

Und das ist, warum Sie unterschiedliche Ergebnisse erhalten, wenn Sie den Operator geändert haben, weil Python unter der Haube eine andere Methode aufruft.

Verwandte Themen