12

from module import *私たちは皆、使用するのは悪い考えだと言われてきました。ただし、ワイルドカードを使用してコンテンツのサブセットをインポートする方法はありますか?module

例えば:

module.py:

MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"
...
MODULE_VAR10 = "lazy"
MODULE_VAR11 = "dog!"
MODULE_VAR12 = "Now"
MODULE_VAR13 = "is"
...
MODULE_VAR98 = "Thats"
MODULE_VAR99 = "all"
MODULE_VAR100 = "folks!"

def abs():
    print "Absolutely useful function: %s" % MODULE_VAR1

from module import *関数をオーバーライドすることになるため、明らかに使用したくありませんabs。しかし、すべてのMODULE_VAR*変数にローカルでアクセスできるようにしたいとします。

単純に置くだけではうまくいきfrom module import MODULE_VAR*ません。これを達成する方法はありますか?

例として 100 個の変数を使用しました。これを行うfrom module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100と明らかに非常に扱いにくくなり、さらに変数 ( などMODULE_VAR101) を追加すると機能しなくなるためです。

4

2 に答える 2

9

そのためのヘルパー関数を使用できます-そしてそれは魔法なしで行うことができます:

import re

def matching_import(pattern, module, globals):
    for key, value in module.__dict__.items():
        if re.findall(pattern, key):
            globals[key] = value

たとえば、次のことができます。

from utils import matching_import
import constants

matching_import("MODULE_VAR.*", constants, globals())

このように明示的に使用globals()すると、通常は有害と見なされるフレーム イントロスペクション マジックを回避できます。

于 2013-06-21T02:40:27.527 に答える
5

変数を使用して、構文__all__を使用するときに特定の変数をインポートできます。import *

mymodule.py

__all__ = [
  'MODULE_VAR1',
  'MODULE_VAR2',
  'MODULE_VAR3',
  'MODULE_VAR4',
  'MODULE_VAR5',
]

MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"

def abs():
  print "Absolutely useful function: %s" % MODULE_VAR1

次に、次のように使用できます。

from mymodule import *
print MODULE_VAR1 # hello
print abs # <built-in function abs>

を使用してモジュールがインポートされる*と、Python は、モジュール__all__内の通常の「パブリック」変数 (アンダースコアで始まらない変数) と見なされるものをオーバーライドできる変数がないかモジュールをチェックし、明示的に定義できるようにします。どの変数が「パブリック」であるか。この質問をチェックしてください

于 2013-06-21T01:39:50.340 に答える