【问题标题】:Extending dictionary with cascading methods使用级联方法扩展字典
【发布时间】:2021-05-01 02:07:52
【问题描述】:

我在 python 中扩展 dict 类:

import jmespath
import json

class superDict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    
    def prettyPrint(self):
        print(self.pprettyPrint())
    
    def pprettyPrint(self):
        return json.dumps(self, indent=4, sort_keys=True, default=str)
    
    def search(self, pattern):
        return jmespath.search(pattern, self)
    
   ...

我希望能够做到:

regDict = {"key": "value"}
super = superDict(regDict)
super.search('patern').prettyPrint()

我这里的问题是 jmespath 可以返回一个列表,所以我不能这样做:

    def search(self, pattern):
        return superDict(jmespath.search(pattern, self))

下一个想法是创建一个 superDict 继承自的 prettyprint 类,也可以用于返回搜索:

class superDict(dict, prettyprint):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    ...

    def search(self, pattern):
        return prettyprint(jmespath.search(pattern, self))

class prettyprint: ???

但我无法弄清楚漂亮打印类会是什么样子才能正常工作。我基本上想不出一种优雅的方式来做到这一点。也许 init 中围绕 arg 类型的一些逻辑会更简单?

【问题讨论】:

  • jmespath.search 返回一个列表时,你想做什么?
  • 无论 jmespath 返回什么,prettyprint 都应该只是 json.dump。但是我的包装器需要一个字典,所以 superDict([list]) 会出错。
  • 您没有使用漂亮的打印模块pprint 有什么原因吗?漂亮的打印不一定是课程的一部分,如果你确实需要漂亮的打印,那么只需使用pprint.pprint(some_variable)
  • Pprint 并不是真正的问题。我对级联方法的优雅方式更感兴趣。

标签: python dictionary methods super self


【解决方案1】:

我最终使用了 new

class extensions:
    def prettyPrint(self):
        print(self.pprettyPrint())
        return self
    
    def pprettyPrint(self):
        return json.dumps(self, indent=4, sort_keys=True, default=str)
    
    def search(self, pattern):
        return exJSON(jmespath.search(pattern, self))

class exList(list, extensions):
    def prettyTable(self, headers):
        x = PrettyTable()
        x.field_names = headers
        for row in self:
            x.add_row(row.values())
        x.align = "l"
        print(x)
        return self

class exDict(dict, extensions):
    pass
        
class exStr(str, extensions):
    pass

class exJSON:
    def __new__(self, obj):
        if type(obj) is dict:
            return exDict(obj)
        if type(obj) is list:
            return exList(obj)
        if type(obj) is str:
            return exStr(obj)
        else:
            return obj

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多