Importazioni nidificate rispetto a due istruzioni di importazione separate?

2

Considera questi due stili di codice che realizzano la stessa cosa:

Importazioni nidificate

common.models

from django.db.models import *

class SmallAutoField(fields.AutoField):
    def db_type(self, connection):
        return "smallserial"

myapp.models :

from common import models

class Test(models.Model):
    id = models.SmallAutoField()
    test = models.IntegerField()

Importazioni separate

common.models

from django.db import models

class SmallAutoField(models.fields.AutoField):
    def db_type(self, connection):
        return "smallserial"

myapp.models :

from django.db import models
from common import models as my_models

class Test(models.Model):
    id = my_models.SmallAutoField()
    test = models.IntegerField()

So quale versione preferisco stilisticamente, ma quale versione è il modo corretto per farlo e perché?

Per quanto riguarda le prestazioni: ho provato a impostare la versione annidata, ma ciò non è possibile perché SyntaxError: import * only allowed at module level . Quindi, c'è un altro modo per confrontare questo metodo?

Bytecode come riferimento, ma non sembra molto indicativo:

>>> dis.dis('from django.db.models import *')
  1           0 LOAD_CONST               0 (0)
              3 LOAD_CONST               1 (('*',))
              6 IMPORT_NAME              0 (django.db.models)
              9 IMPORT_STAR
             10 LOAD_CONST               2 (None)
             13 RETURN_VALUE
>>> dis.dis('from django.db import models')
  1           0 LOAD_CONST               0 (0)
              3 LOAD_CONST               1 (('models',))
              6 IMPORT_NAME              0 (django.db)
              9 IMPORT_FROM              1 (models)
             12 STORE_NAME               1 (models)
             15 POP_TOP
             16 LOAD_CONST               2 (None)
             19 RETURN_VALUE
    
posta dtgq 21.11.2016 - 18:37
fonte

1 risposta

1

La classe SmallAutoField è in realtà un'innovazione creata per questa particolare applicazione: è un miglioramento. "Sposta la palla in campo", per così dire, migliorando la capacità di descrivere la persistenza.

Per un nuovo lettore del programma da oggi (ad esempio un ingegnere che deve capire cosa fa) l'intento del secondo stile è leggermente più chiaro nel complesso: possono facilmente vedere che i "modelli" si riferiscono a Django.db .models e "my_models" a qualcosa di nuovo.

Il secondo stile, evidenzia il credito ricevuto per l'innovazione definendolo "my_models". Potrebbe essere utile evidenziare ulteriormente l'intento come "serial_id_models" o "advanced_models."

HTH - Rich

    
risposta data 14.07.2018 - 12:36
fonte

Leggi altre domande sui tag