10

cmdモジュールを使用して実装された行指向のコマンド インタープリターで、コマンドのエイリアスを作成するにはどうすればよいですか?

do_cmdコマンドを作成するには、メソッドを実装する必要があります。しかし、長い名前constraintのコマンド ( など) があり、これらのコマンド ( など) にエイリアス (実際にはショートカット) を提供したいと考えていますco。どうやってやるの?

do_alias私の頭に浮かんだ1つの可能性は、 (like ) メソッドを実装し、このメソッドで( ) をdo_co呼び出すことです。しかし、これにより、CLI のヘルプに新しいコマンドが表示されます。do_cmddo_constraint

これを達成する他の方法はありますか?helpまたは、出力からコマンドを非表示にする方法はありますか?

4

3 に答える 3

9

次のソリューションでは、エイリアス化されたコマンドが 1 つのヘルプ メッセージを共有します。これにより、すべてのエイリアスを編集しやすい 1 つの場所に保持できると同時に、文書化がはるかに簡単になります。関数値を使用してエイリアス ディクショナリに対してユーザー入力をチェックし、 default()( sloth & brianを参照) メソッドとメソッドの両方をオーバーライドしますdo_help()

ここではエイリアス'c'を作成し、'con'execute do_constraint()'q'invoke do_quit()、および'h'invoke を作成しましdo_help()た。このソリューションのボーナスは、同じメッセージを出力することです'h q''help quit'複数のエイリアス コマンドのドキュメントは、単一のドキュメント文字列で管理できます。

import cmd

class prompt(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.aliases = { 'c'   : self.do_constraint ,
                         'con' : self.do_constraint ,
                         'q'   : self.do_quit       ,
                         'h'   : self.do_help       }

    def do_constraint(self, arg):
        '''Constrain things.'''
        print('Constraint complete.')

    def do_quit(self, arg):
        '''Exit the program.'''
        return True

    def do_help(self, arg):
        '''List available commands.'''
        if arg in self.aliases:
            arg = self.aliases[arg].__name__[3:]
        cmd.Cmd.do_help(self, arg)

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        if cmd in self.aliases:
            self.aliases[cmd](arg)
        else:
            print("*** Unknown syntax: %s" % line)
于 2016-09-15T21:17:30.763 に答える
9

メソッドを上書きしdefaultて、適切なコマンド ハンドラーを検索できます ( Brianによって既に提案されているように)。

import cmd

class WithAliasCmd(cmd.Cmd):

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        func = [getattr(self, n) for n in self.get_names() if n.startswith('do_' + cmd)]
        if func: # maybe check if exactly one or more elements, and tell the user
            func[0](arg)
于 2012-10-16T09:55:17.743 に答える
1

ドキュメントには、不明なコマンドを処理するために上書きできるデフォルトの方法が記載されています。コマンドのリストをプレフィックススキャンし、do_alias に対して提案したようにそれらを呼び出すようにコーディングします。

于 2012-10-16T09:45:50.530 に答える