如何在命令行运行python类方法

时间:2017-03-14 20:20:28

标签: python

我尝试使用以下方法连接到sqllite数据库:

class Sqllite_utilities(object):

    def __init__(self):

        parser = argparse.ArgumentParser()
        parser.add_argument("-s","--source", type=str,
                            help="source table from db")
        args = parser.parse_args()
        print(args)


        source_table= args.source

        db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"

        dataset_db = dataset.connect(db_path)
        self.dataset_table = dataset_db[source_table]


    def missing_ids(self):

        for user in self.dataset_table:
            print(user['id'])


if __name__ == '__main__':
    Sqllite_utilities.missing_ids(sys.argv[1])

当我这样做时:

$ python find_missing_records.py -s test

我明白了:

Traceback (most recent call last):
  File "find_missing_records.py", line 41, in <module>
    Sqllite_utilities.missing_ids(sys.argv[1])
TypeError: unbound method missing_ids() must be called with Sqllite_utilities instance as first argument (got str instance instead)
(contact2E)

我做错了什么?

2 个答案:

答案 0 :(得分:4)

做的时候:

Sqllite_utilities.missing_ids(sys.argv[1])

您使用missing_ids(字符串)调用sys.argv[1]实例方法为self(调用实例方法的功能方法,但使用了错误的对象),这解释了错误信息。

很明显,您必须先创建对象的实例才能使用实例方法(没有@staticmethod@classmethod装饰器的方法):

if __name__ == '__main__':
    s = Sqllite_utilities()

构造函数使用默认情况下使用argparse.ArgumentParser的{​​{1}}来解析参数,所以将它放在一边,它就可以工作。

然后在实例上调用您的方法:

sys.argv
调用s.missing_ids()

时,

s隐式传递为self

答案 1 :(得分:1)

根据此问题的最佳答案建议:unbound method f() must be called with fibo_ instance as first argument (got classobj instance instead)

添加到您的代码:

if __name__ == '__main__':
    obj = Sqllite_utilities()
    s.missing_ids()