同じことを実行する次の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
SmallAutoFieldクラスは、実際にはこの特定のアプリケーションのために作成されたイノベーションです-それは改善です。それは、いわば「ボールをフィールドに落とす」ことで、粘り強さを表現する能力を向上させます。
今後数年のプログラムの新しい読者(たとえば、それが何をするかを理解する必要があるエンジニア)にとって、2番目のスタイルの意図は全体的に少し明確です。 「my_models」を新しいものに。
2番目のスタイルは、「my_models」と呼ぶことにより、イノベーションに対して授与されたクレジットを強調しています。 「serial_id_models」や「advanced_models」のようにインテントをさらに強調するとよいでしょう。
HTH-リッチ