【问题标题】:How to call this function right?如何正确调用此函数?
【发布时间】:2021-07-14 07:30:25
【问题描述】:

大家好,我目前正在尝试使用两种方法构建 phone_numbers 生成器。第一个是 phone_numbers,每次需要新生成的号码时都应该调用它。您可以从 next_phone_numbers 获取号码。如果没有可用的号码,此函数还应调用 phone_numbers。但是,当我调用它时,我总是会收到一条错误消息。这是我的代码:

 def phone_number(self):
        request = requests.get('https://www.bestrandoms.com/random-at-phone-number')
        soup = BeautifulSoup(request.content, 'html.parser')

        self.phone_numbers = soup.select_one('#main > div > div.col-xs-12.col-sm-9.main > ul > textarea').text
        self.phone_numbers = self.phone_numbers.splitlines()
        for phone in range(len(self.phone_numbers)):
            self.phone_numbers[phone] = '+43' + self.phone_numbers[phone][1:].replace(' ', '')

        self.phone_numbers.extend(self.phone_numbers)
        return self.phone_numbers

    @property
    def next_phone_number(self):
        self.phone_index += 1
        if self.phone_index >= len(self.phone_numbers):
            self.phone_number()

        return self.phone_numbers[self.phone_index]

错误信息: enter image description here

【问题讨论】:

    标签: python list function call phone-number


    【解决方案1】:

    当您执行self.phone_numbers = soup.select_one(...) 时,您正在破坏self.phone_numbers 中的旧电话号码列表,并将其替换为您从网页解析的数据。您稍后将其细化为一个新列表,但在添加新数字方面它仍然没有达到您想要的效果(我没有尝试过代码,我猜您总是从网络上获得相同数量的它们)。

    您应该为新数据使用不同的变量名称。这样您就可以extend 现有列表和新数据,而不会覆盖您已有的任何内容:

    def phone_number(self):
        request = requests.get('https://www.bestrandoms.com/random-at-phone-number')
        soup = BeautifulSoup(request.content, 'html.parser')
    
        # these lines all use new local variables instead of clobbering self.phone_numbers
        new_data = soup.select_one('#main > div > div.col-xs-12.col-sm-9.main > ul > textarea').text
        new_numbers = new_data.splitlines()
        new_numbers_reformatted = ['+43' + number[1:].replace(' ', '') for number in new_numbers]
    
        # so now we can extend the list as desired
        self.phone_numbers.extend(new_numbers_reformatted)
        return self.phone_numbers
    

    您可能还需要更改类中的初始化代码,以确保它将self.phone_numbers 初始化为一个空列表,如果它还没有这样做的话。如果列表没有在其他任何地方创建,您的方法的不良行为可能会掩盖错误。

    【讨论】:

      【解决方案2】:

      问题是phone_number() 函数没有扩展self.phone_numbers 列表足以覆盖self.phone_index 超出范围的事实。也许考虑这样做以扩展直到它足够大:

          @property
          def next_phone_number(self):
              self.phone_index += 1
              while self.phone_index >= len(self.phone_numbers):
                  self.phone_number()
      
              return self.phone_numbers[self.phone_index]
      

      【讨论】:

      • 不,那是错误的,会造成无限循环。感谢您的尝试。
      猜你喜欢
      • 2020-01-11
      • 2022-12-13
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多