0

SimpleXMLRPCServer からサブクラス化された複数のデバイス上に多数のサーバーがあり、すべてポート 9999 で実行される傾向があります。

欲しいです:

server 0.0.0.0  9999

また:

server host=0.0.0.0 port=9999

得た:

server (*sys.argv[:1])

そして、サーバーは、順序付けのためにリッスンする間違ったインターフェイスを選択するか、基本クラスが「賢すぎる」ためにデュアルホーミングを選択します。

基本クラスは、ローカル ホストで使用可能な IP から 1 つを選択して IP を生成します。すべてのサブクラスの下位互換性を壊さずに、IP を指定するにはどうすればよいですか?

通常、各サーバーはポートを受け入れますが、常に 9999 のようです。次に、interfacelist を調べて、127.0.0.1 以外のポートを選択します。

提案: 引数が数値の場合は、ポートであると想定してください。IP の場合は、ホストと見なします。

class Server(SimpleXMLRPCServer):
    def __init__(self, port=1234):
        host = get_ip()
        SimpleXMLRPCServer.__init__(self,addr=(host, port)) 

これは、SimpleXMLRPCServer のサブクラスの引数を逆にするため、奇妙な妥協のように感じます。

class Server(SimpleXMLRPCServer):
    def __init__(self, port, host=None):
        if host is None:
            host = get_ip()
        SimpleXMLRPCServer.__init__(self,addr=(host, port)) 

変更が 4 つのサブクラスすべてに影響する場合、私はがっかりするでしょう。顧客は変更があったことを知りませんが、デュアル ホーミングはおそらく、ポットラックの代わりに追加の引数で開始されたクラスで機能します。

サブクラスはすべてこれを行います:

class Server(SimpleXMPLRPCServer):
    def __init__(self, port=1234):
       host = get_ip()
       SimpleXMLRPCServer.__init__(self,(host, port)) 

そして、main() 呼び出しは次のとおりです: Server(*sys,argv[:1])

4

1 に答える 1

0

あなたが何をしようとしているのかよくわかりませんが、これを突き刺してみましょう。

まず、SimpleXMLRPCServerのコンストラクター(host, port)ペアをaddrパラメーターとして受け取ります。したがって、サブクラスは次のようになります。

class Server(SimpleXMLRPCServer):
    def __init__(self, *whatever):
        # host, port = something
        SimpleXMLRPCServer.__init__(self, (host, port)) 

それを回避する方法はありません。

各サブクラスにビットを書き込むことを避けたいだけの場合はif host is None、中間クラスを挿入してください。

class BaseServer(SimpleXMLRPCServer):
    def __init__(self, port=1234, host=None):
        if host is None:
            host = get_ip()
        SimpleXMLRPCServer.__init__(self, (host, port))

そして今、あなたのサブクラスのそれぞれは、あなたが望む方法で書くことができます(私は思う):

class FirstServer(BaseServer):
    def __init__(self, port=1234, host=None):
        # any other initialization you need to do
        BaseServer.__init__(self, port, host)

class SecondServer(BaseServer):
    # no extra initialization at all needed for this subclass

もちろん、モンキーパッチを適用してインターフェイスを変更することでそれを行うこともできます...なぜですか? SimpleXMLRPCServer.__init__あなたのコードを読んでいる人 (今から 6 か月後のあなたを含む) はSimpleXMLRPCServer、ドキュメントが言うように動作しない理由を理解する必要があるため、混乱を招くだけです。中級クラスでも同じメリットが得られますが、何の問題もありません。

于 2013-10-02T22:45:16.937 に答える