代码之家  ›  专栏  ›  技术社区  ›  cap

类内递归函数的静态方法?

  •  0
  • cap  · 技术社区  · 7 年前

    我正在使用从yaml对象中获得的关于python(2.7)的嵌套字典,我有几个问题一直想通过阅读得到答案,但没有成功。我对巨蟒有点陌生。

    最简单的函数之一是读取整个字典并输出其中所有键的列表。我在开头使用下划线,因为这个函数稍后被类中的其他人使用。

        class Myclass(object):
    
        @staticmethod
        def _get_key_list(d,keylist):
            for key,value in d.iteritems():
                keylist.append(key)
                if isinstance(value,dict):
                    Myclass._get_key_list(d.get(key),keylist)
            return list(set(keylist))
    
        def diff(self,dict2):
            keylist = []
            all_keys1 = self._get_key_list(self.d,keylist)
            all_keys2 = self._get_key_list(dict2,keylist)
            ... # More code
    

    问题1:这是正确的方法吗?我不确定出于这个原因使用静态方法是否是一个好的实践。自 self._get_key_list(d,keylist) 是递归的,一旦函数被递归调用,我不希望“self”成为第一个参数,这就是常规实例方法将要发生的情况。

    我使用了很多静态方法,但是我在很多地方读过,它们在很多地方可能不是很好的实践。我还以为我可以让它们成为模块函数,但我希望它们与类绑定在一起。

    问题2:而不是通过争论 keylist Self.\u获取\u key\u列表(d,key list) ,如何初始化递归函数内的空列表并更新它?每次在内部初始化都会将其重置为[]。

    2 回复  |  直到 7 年前
        1
  •  1
  •   chepner    7 年前

    keylist

    def _get_keys(d):
        keyset = set()
        for key, value in d.iteritems():
            keylist.add(key)
            if isinstance(value, dict):
                keylist.update(_get_key_list(value))
        return keyset
    

    None

    def _get_keys(d, result):
        for key, value in d.iteritems():
            result.add(key)
            if isinstance(value, dict):
                _get_keys(value, result)
    
    result = set()
    _get_keys(d1, result)
    _get_keys(d2, result)
    # etc
    
        2
  •  0
  •   blhsing    7 年前

    class Myclass(object):
        def _get_key_list(self, d, keylist=None):
            if keylist is None:
                keylist = []
            for key, value in d.iteritems():
                keylist.append(key)
                if isinstance(value, dict):
                    self._get_key_list(d.get(key), keylist)
            return list(set(keylist))
    
        def diff(self, dict2):
            all_keys1 = self._get_key_list(self.d)
            all_keys2 = self._get_key_list(dict2)
            ...  # More code