3

パラメータ化したいモジュールがあります。または、オブジェクトから関数をインポートしたいと考えています。

つまり、何かをインポートする前に、動作を変更する引数を与えることができるようにしたいと考えています。

1 つの方法は、モジュールをオブジェクトにして、それらの関数を使用することです。現在、私はこれを行います:

class MyModule(object):
    def __init__(self, previous_sayings):
        self.sayings = previous_sayings
    __all__ = ['sayhi']
    def sayhi(self):
        self.sayings.append("hi!")

mod = MyModule(["oh no!"])
sayhi = mod.sayhi
sayhi()
sayhi()
print mod.sayings

これが出力されるはず["oh no!", "hi!", "hi!"]です。

ただし、これは機能が多ければ多いほどうまく機能しなくなります。

私はこのようなことをしたいと思います:

mod = MyModule(["oh no!"])
from mod import * 
sayhi()
sayhi()

print mod.sayings

このようなことは可能ですか?基本モジュールから継承できますか? 何が起こっているのかユーザーに明白に見えるようにする必要があるという制約を追加するとどうなりますか?

4

3 に答える 3

2

モジュールについて理解すべきことがいくつかあります。

  • それらはシングルトンです。つまり、インポートする場所の数に関係なく、そのうちの 1 つしかありません。

  • 引数を渡すことはできません

  • from <module> import *危険であり、良い習慣ではありません。そのように設計されたモジュールでのみ使用する必要があります

  • モジュールで定義されているすべての関数、クラスなどは、常にそのモジュールをグローバル名前空間として認識します。

あなたが望むものに似たものを得ることができます:

8<--mod.py------------------------------------------------------
sayings = []
def sayhi():
    sayings.append("Hi!")
8<--------------------------------------------------------------

import mod
mod.sayings = ['oh no!']   # or mod.sayings.append('oh no')
from mod import sayhi
sayhi()
sayhi()
print mod.sayings
于 2013-02-06T00:52:21.407 に答える
0

モジュールを動的に作成してインポートできます。

http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/

ただし、私の提案はクラスを使用することです。

于 2013-02-06T00:43:29.523 に答える
0

唯一の問題が次の場合:

sayhi=mod.sayhi()
saybye=mod.saybye()
# … 40 more functions

以下よりも詳細です。

from mod import sayhi, saybye, # … 40 more functions

より良い解決策は、おそらくプログラムでインポートを行うことです:

for name in mod.__all__:
    locals[name] = getattr(mod, name)

または:

locals.update({name: getattr(mod, name) for name in mod.__all__})
于 2013-02-06T01:16:27.907 に答える