4

ドキュメントは、CommandLineApp のサブクラス化について非常に曖昧であり、1 つの例のみに言及しています。

class YourApp(cli.app.CommandLineApp):
    def main(self):
        do_stuff()

だから私が見つけた情報で、このコードをつなぎ合わせました:

#!/usr/bin/env python

import os
import sys
from cli.app import CommandLineApp

# Append the parent folder to the python path
sys.path.append(os.path.join(os.path.dirname(__file__), '../'))

import tabulardata
from addrtools import extract_address

class SplitAddressApp(CommandLineApp):
    def main(self):
        """
        Split an address from one column to separate columns.
        """

        table = tabulardata.from_file(self.params.file)

        def for_each_row(i, item):
            addr = extract_address(item['Address'])
            print '%-3d %-75s %s' % (i, item['Address'], repr(addr))

        table.each(for_each_row)

    def setup(self):
        self.add_param('file', metavar='FILE', help='The data file.')
        self.add_param(
            'cols', metavar='ADDRESS_COLUMN', nargs='+',
            help='The name of the address column. If multiple names are ' + \
                 'passed, each column will be checked for an address in order'
        )

if __name__ == '__main__':
    SplitAddressApp().run()

これは私には正しいようです。ドキュメントには、setupサブクラス化を使用する場合のメソッドの処理方法やアプリケーションの実行方法に関する例はありません。エラーが発生します:

トレースバック (最新の呼び出しが最後):
  ファイル「bin/split_address_column」の 36 行目
    SplitAddressApp().run()
  ファイル "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py"、440 行目、__init__ 内
    Application.__init__(self, main, **kwargs)
  ファイル "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py"、129 行目、__init__ 内
    self.setup()
  ファイル「bin/split_address_column」、28 行目、セットアップ中
    self.add_param('file', metavar='FILE', help='データ ファイル')
  ファイル「/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py」、385行目、add_param
    アクション = self.argparser.add_argument(*args, **kwargs)
AttributeError: 'SplitAddressApp' オブジェクトに属性 'argparser' がありません

おそらく私は何か間違ったことをしているのですが、何ですか?

4

1 に答える 1

5

私はそれを考え出した。pyCLI のソースを読むと、このsetup関数はライブラリ全体の機能にとって非常に重要であることがわかりましたが、セットアップ コードを配置できる単なる関数だと思っていました。少なくとも呼び出す必要があるという意味でargparser作成されますcli.app.CommandLineApp.setup

cli.app.CommandLineApp.setup(self)

それが機能するためのセットアップ関数内。そして今、コードは完全に機能します!

于 2012-09-12T12:02:29.873 に答える