【问题标题】:Python function recursion within a class类中的 Python 函数递归
【发布时间】:2019-05-06 22:31:10
【问题描述】:

我做了下面的课程。

class Message:

    def __init__(self, message):
        self.message = message
        self.__dict__.update(message)

    def dict_value_finder(self, field, partial_match=False):
        """It Takes a dict with nested lists and dicts,
        and searches all dicts for a key of the field
        provided and return the value(s) as a list.
        set partial_match = True to get partial matches.
        """
        fields_found = []

        for key, value in self.message.items():

            if field in key if partial_match else field == key:
                fields_found.append(value)
                print(key, value)

            elif isinstance(value, dict):
                results = dict_value_finder(value, field, partial_match)
                fields_found.extend(results)

            elif isinstance(value, list):
                for item in value:
                    if isinstance(item, dict):
                        more_results = dict_value_finder(item, field,
                                                         partial_match)
                        fields_found.extend(more_results)

        return fields_found

函数 dict_value_finder 可以在类之外工作,如下所示:

def dict_value_finder(search_dict, field, partial_match=False):
    """Takes a dict with nested lists and dicts,
    and searches all dicts for a key of the field
    provided and return the value(s) as a list.
    set partial_match = True to get partial matches.
    """
    fields_found = []

    for key, value in search_dict.items():

        if field in key if partial_match else field == key:
            fields_found.append(value)
            print(key, value)

        elif isinstance(value, dict):
            results = dict_value_finder(value, field, partial_match)
            fields_found.extend(results)

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = dict_value_finder(item, field,
                                                     partial_match)
                    fields_found.extend(more_results)

    return fields_found

但是当我把它放在类中时,我得到了错误:

  File "<ipython-input-42-76ab838299bc>", line 23, in dict_value_finder
    results = dict_value_finder(value, field, partial_match)

NameError: name 'dict_value_finder' is not defined

我不确定如何将此函数添加到需要递归的类中。

【问题讨论】:

  • 您在引用message 时使用了self,但在引用dict_value_finder 时没有使用。为什么?

标签: python function class recursion methods


【解决方案1】:

results = dict_value_finder(value, field, partial_match) 更改为:

results = self.dict_value_finder(value, field, partial_match)

more_results = dict_value_finder(item, field,partial_match) 到:

more_results = self.dict_value_finder(item, field,partial_match)

为了访问类实例的属性,我们应该使用self

为了解决cmets中的问题:

def dict_value_finder(self, field, partial_match=False, search=None):

    fields_found = []

    search =  search or self.message

    for key, value in search.items():

        if field in key if partial_match else field == key:
            fields_found.append(value)
            print(key, value)

        elif isinstance(value, dict):
            results = self.dict_value_finder(field, partial_match, value)
            fields_found.extend(results)

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = self.dict_value_finder(field,partial_match, item)
                    fields_found.extend(more_results)

    return fields_found

【讨论】:

  • TypeError: dict_value_finder() 需要 2 到 3 个位置参数,但给出了 4 个
  • 它不应该将 self 作为第一个参数,而是 value 或 item
  • 这来自你的方法def dict_value_finder(self, field, partial_match=False):的定义,你没有在那里定义itemvalue
  • item 和 value 应该替换 self.message。我该怎么做?
猜你喜欢
  • 2012-11-22
  • 2019-04-17
  • 2017-06-14
  • 1970-01-01
  • 2013-03-09
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多