Python 方法uuu init_uuuu的参数太多

Python 方法uuu init_uuuu的参数太多,python,Python,我是Python的新手(我大约3周前开始使用Python),我正在尝试编写一个脚本,用于抓取网页上的信息。在检索到信息后,它通过一个函数对其进行格式化,然后将其传递给一个以17个变量作为参数的类。该类使用此信息来计算其他一些变量,并且当前有一个方法来构造字典。代码按预期工作,但我在Pycharm中使用的一个名为Sonarint的插件突出显示17个变量太多,无法用作参数 我已经找到了将信息传递给类的其他方法,比如元组或列表,但找不到多少似乎相关的信息。将许多变量作为参数传递给类的最佳实践是什么?或

我是Python的新手(我大约3周前开始使用Python),我正在尝试编写一个脚本,用于抓取网页上的信息。在检索到信息后,它通过一个函数对其进行格式化,然后将其传递给一个以17个变量作为参数的类。该类使用此信息来计算其他一些变量,并且当前有一个方法来构造字典。代码按预期工作,但我在Pycharm中使用的一个名为Sonarint的插件突出显示17个变量太多,无法用作参数

我已经找到了将信息传递给类的其他方法,比如元组或列表,但找不到多少似乎相关的信息。将许多变量作为参数传递给类的最佳实践是什么?或者我根本就不应该用一个类来处理这类事情

我已经减少了变量的数量和代码的易读性,但这里是类

Class GenericEvent:

    def __init__(self, type, date_scraped, date_of_event, time, link, 
                 blurb):

      countdown_delta = date_of_event - date_scraped
      countdown = countdown_delta.days

      if countdown < 0:
          has_passed = True
      else:
          has_passed = False

      self.type = type
      self.date_scraped = date_scraped
      self.date_of_event = date_of_event
      self.time = time
      self.link = link
      self.countdown = countdown
      self.has_passed = has_passed
      self.blurb = blurb

    def get_dictionary(self):

      event_dict = {}
      event_dict['type'] = self.type
      event_dict['scraped'] = self.date_scraped
      event_dict['date'] = self.date_of_event
      event_dict['time'] = self.time
      event_dict['url'] = self.link
      event_dict['countdown'] = self.countdown
      event_dict['blurb'] = self.blurb
      event_dict['has_passed'] = self.has_passed

      return event_dict
以及通过调用以下命令检索词典:

event_info.get_dictionary()
我打算向类中添加其他方法,以便能够执行其他操作(不仅仅是创建一个字典),但希望在扩展类的功能之前解决这个问题


任何帮助或链接将不胜感激

我不认为你所做的有什么不对。但是,您可以将参数作为单个dict对象引入,然后通过在dict上迭代或对每个dict显式执行操作来处理它们。对你来说,这似乎会让你的代码更混乱

由于构造函数的所有参数都是命名参数,因此可以执行以下操作:

def __init__(self, **params):
这将为您提供一个名为params的dict,然后您可以对其进行处理。键是参数名,值是参数值

如果将参数名与get_dictionary方法的返回值中的键对齐,则将此参数作为一个整体保存可能会使该方法的编写变得简单

下面是代码的缩写版本(修复了一些语法错误),说明了这一想法:

from pprint import pprint

class GenericEvent:

    def __init__(self, **params):
        pprint(params)

event_info = GenericEvent(type="Lunar",
                          date_scraped="30/01/19",
                          date_of_event="28/07/19",
                          time="12:00",
                          link="www.someurl.com",
                          blurb="Some string.")
结果:

{'blurb': 'Some string.',
 'date_of_event': '28/07/19',
 'date_scraped': '30/01/19',
 'link': 'www.someurl.com',
 'time': '12:00',
 'type': 'Lunar'}

一个选项是命名元组:

from typing import Any, NamedTuple


class GenericEvent(NamedTuple):
    type: Any
    date_scraped: Any
    date_of_event: Any
    time: Any
    link: str
    countdown: Any
    blurb: str

    @property
    def countdown(self):
        countdown_delta = date_of_event - date_scraped
        return countdown_delta.days

    @property
    def has_passed(self):
        return self.countdown < 0

    def get_dictionary(self):
        return {
            **self._asdict(),
            'countdown': self.countdown,
            'has_passed': self.has_passed,
        }
输入import Any,NamedTuple
类GenericEvent(NamedTuple):
类型:任何
刮掉的日期:有吗
活动日期:任何
时间:有吗
链接:str
倒计时:有吗
简介:str
@财产
def倒计时(自):
倒计时\u delta=事件的日期\u-刮取的日期\u
返回倒计时_delta.days
@财产
def已通过(自我):
返回自倒计时<0
def get_字典(自我):
返回{
**self.\u asdict(),
“倒计时”:self.countdown,
'has_passed':self.has_passed,
}
(将
Any
s替换为字段的实际类型,例如
datetime.datetime


或者,如果您希望它是可变的,a.

非常感谢您的帮助,它提供了非常丰富的信息,非常有用。我必须去了解一下命名元组,因为我以前没有遇到过它们,而且我也不太熟悉@property,因为我没有创建很多类,但一旦我掌握了它,我就把它引入了我的代码中。由于我只使用这个特定的命名元组将信息传递给我的类以创建实例,因此我在类中创建了一个静态方法,以便在需要时创建命名元组。。。有点旁白,但这是静态方法的适当用法吗?@jonfillips:可能是!如果需要额外确认,您可以输入最终代码。(另外,冻结的数据类实际上可能比命名的元组更好,但差别并没有那么大,所以不用担心。)谢谢。我会的。在我从在线资源学习Python时,获得一些反馈是很好的。我还将研究数据类。我有很多东西要学。。。
from typing import Any, NamedTuple


class GenericEvent(NamedTuple):
    type: Any
    date_scraped: Any
    date_of_event: Any
    time: Any
    link: str
    countdown: Any
    blurb: str

    @property
    def countdown(self):
        countdown_delta = date_of_event - date_scraped
        return countdown_delta.days

    @property
    def has_passed(self):
        return self.countdown < 0

    def get_dictionary(self):
        return {
            **self._asdict(),
            'countdown': self.countdown,
            'has_passed': self.has_passed,
        }