Python:关键字参数的使用

起源

下午在写一个Python连接MongoDB的工具(使用pymongo 3.2).并且使用Python 3.4.但是遇到一个问题,就是调用的时候,发现报错.

报错的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 def findAll(self, **kwargs):
        print(kwargs)
        limit = kwargs.get('limit', None)
        skip = kwargs.get('skip', None)
        query = kwargs.get('query', None)
        sortQuery = kwargs.get('sortQuery', None)
        if self.dbname:
            collections = self.collection
            db = self.getDB()
            print(limit, skip)
            resultData = None

            def findPage(self, limit, skip):  # 分页查询数据
                print(limit, skip)
                if isinstance(limit, int) and isinstance(skip, int):
                    resultData = db.collections.find().limit(limit).skip(skip)
                else:
                    def findAllData(self, query, sortQuery):  # 查询数据
                        print(self.dbname + "----" + self.collection)
                        resultData = db.collections.find(query).sort(sortQuery)

            return resultData

调用:

1
2
3
print(dao.findAll(limit=2, skip=1))
print(dao.findAll(query={"x": "55"}))
print(dao.findAll(query={"x": "55"}, sortQuery={"x": "55"}))

报错:

Traceback (most recent call last):
File “DaoUtil.py”, line 84, in
print([item for item in dao.findAll(limit=2, skip=1)])
TypeError: ‘NoneType’ object is not iterable

写这段程序的时候,参照了网上一个例子,但是忽略了一个重要的部分{也是最重要的部分}.所以就报错了.

python Logo
image-2360

修改后的程序

下面的程序是最新的,可以运行的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
""" 查询数据 """

    def findAll(self, **kwargs):
        # print(kwargs)
        if self.dbname:
            collections = self.collection
            db = self.getDB()

            def findPage(self, dataLimit=None, dataSkip=None):  # 分页查询数据
                if dataLimit and isinstance(dataLimit, int):  # limit 最多只显示多少.
                    return db.collections.find().limit(dataLimit)

                if dataSkip and isinstance(dataSkip, int):  # 跳过多少条
                    return db.collections.find().limit(10).skip(dataSkip)

                if isinstance(dataLimit, int) and isinstance(dataSkip, int):
                    return db.collections.find().limit(dataLimit).skip(dataSkip)

            def findAllData(self, dataQuery=None, dataSortQuery=None):  # 查询数据
                if dataQuery:
                    return db.collections.find(dataQuery)
                else:
                    return db.collections.find()

                if dataSortQuery:
                    return db.collections.find().sort(dataSortQuery)
                if dataQuery and dataSortQuery:
                    return db.collections.find(dataQuery).sort(dataSortQuery)

            if len(kwargs) == 2:
                limit = kwargs.get('dataLimit', "")
                skip = kwargs.get('dataSkip', "")
                query = kwargs.get('dataQuery', "")
                sortQuery = kwargs.get('dataSortQuery', "")
                if limit or skip:
                    return findPage(self, **kwargs)
                elif query or sortQuery:
                    return findAllData(self, **kwargs)
            else:
                return findAllData(self, "", "")

调用如下:

1
2
3
4
5
6
7
    print([item for item in dao.findAll()])
    print([item for item in dao.findAll(dataLimit=2, dataSkip=1)])
    print([item for item in dao.findAll( dataSkip=1)])
    print([item for item in dao.findAll(dataLimit=2)])
    print([item for item in dao.findAll(dataQuery={"x": "55"})])
    print([item for item in dao.findAll(dataSortQuery=[("x", "55")])])
    print([item for item in dao.findAll(dataQuery={"x": "55"}, dataSortQuery=[("x", "55")])])

输出MongoDB里面的数据.

最重要,工具目前暂未完成,剩余部分暂时不发了.等写完了再发整个工具.(不会安装MongoDB?自己搜索下.)

PS:工具已经完整发布(地址).

发表评论

您的电子邮箱地址不会被公开。

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据