Hello guys!!!
これは、に出力される単純な python wsgi サーバーです0.0.0.0:8080
。
from wsgiref.simple_server import make_server
content = 'Hello guys!!!'
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [content]
server = make_server('0.0.0.0', 8080, application)
server.serve_forever()
このコードを見ると、いくつかの疑問が生じます。
関数は関数名だけでどのように
make_server
機能しますapplication
か? これが他にどのように機能し、(関数オブジェクトの)"<function application at 0x7f71686286e0>"
文字列を返すかはわかりません。application.__repr__() method
この関数内で使用されておらず、後で関数呼び出しで設定されていないのに、アプリケーション関数定義
environ
が引数として定義されるのはなぜですか?application
私が理解していることから、関数定義の引数は、ここでは一種の識別子として使用され、これが関数呼び出し
start_response
で後で必要になる他のプロパティを設定する関数の名前になります。make_server
その機能は標準ライブラリのどこで定義されていますか? (関連するモジュールのソースを確認しましたが、これがどこで行われているのか正確にはわかりません)
観察事項:environ
関数定義で引数を変更しても、コードの動作は何も変わりませんが、引数は関数の本体start_response
と同じ名前にする必要があります。start_response
application
辞書であることは知ってos.environ
いますが、Python 標準ライブラリで呼び出されている場所が見つかりません。引数が必要であり、唯一の実行可能な最初の引数である場合、毎回environ
最初の引数( ) を明示的に指定する必要がある理由がわかりません。別の引数を使用するとその動作に影響するという錯覚を与えます。environ
私は「暗黙よりも明示的」-pythonポリシーを認識していますが、ここでは役に立たず、混乱していると思います。
編集
ネッドの答えのおかげで、などmake_server('0.0.0.0', 8080, application)
のインスタンスを作成するソースを見て理解できるようになりました。さらに詳しく調べると、初期化メソッドが から継承されていることがわかりました。BaseServer インスタンスには、 特にインスタンス変数として と があります。関数オブジェクトは のクラス変数に格納されます。WSGIServer
wsgiref.simple_server.WSGIServer((host, port), handler_class))
BaseServer
server_address
RequestHandlerClass
application
application
WSGIServer
application
しかし、このクラス変数がPythonソースのどこかで使用されている場所をまだ見つけることができません。( の親クラスのクラス定義を含むすべてのモジュールを検索しましたWSGIServer
) どこで使用されているか知っている人はいますか? それが私のすべての質問に答えてくれる可能性があります。