web-dev-qa-db-ja.com

ネストされたインポートと2つの個別のインポートステートメント

同じことを実行する次の2つのコードスタイルを考えてみます。

ネストされたインポート

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()

個別のインポート

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()

私はスタイルを優先してどのバージョンを知っていますが、どのバージョンがそれを行う適切な方法であり、なぜですか?

パフォーマンスについて:ネストされたバージョンの時間を計ろうとしましたが、SyntaxError: import * only allowed at module level。それで、この方法をベンチマークする別の方法はありますか?

参考のためのバイトコードですが、それは多くを伝えるようには見えません:

>>> 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
2
dvtan

SmallAutoFieldクラスは、実際にはこの特定のアプリケーションのために作成されたイノベーションです-それは改善です。それは、いわば「ボールをフィールドに落とす」ことで、粘り強さを表現する能力を向上させます。

今後数年のプログラムの新しい読者(たとえば、それが何をするかを理解する必要があるエンジニア)にとって、2番目のスタイルの意図は全体的に少し明確です。 「my_models」を新しいものに。

2番目のスタイルは、「my_models」と呼ぶことにより、イノベーションに対して授与されたクレジットを強調しています。 「serial_id_models」や「advanced_models」のようにインテントをさらに強調するとよいでしょう。

HTH-リッチ

1
RichMeister