【问题标题】:How can I make this code-snippet prettier?我怎样才能使这个代码片段更漂亮?
【发布时间】:2018-07-14 13:02:13
【问题描述】:

我正在寻找一种方法来缩短这个 python3 函数。该函数需要大量输入变量并检查每个变量以查看它是否为无。有没有办法遍历所有输入变量并将不是 None 的变量添加到 params 字典中?

def news(self, query = None, instrument_id = None, days = None, news_lang = None, news_country = None, market_id = None, limit = None, offset = None, source_id = None):

    params = {}
    if query is not None:
        params['query'] = query
    if instrument_id is not None:
        params['instrument_id'] = instrument_id
    if news_lang is not None:
        params['news_lang'] = news_lang
    if news_country is not None:
        params['news_country'] = news_country
    if limit is not None:
        params['limit'] = limit
    if offset is not None:
        params['offset'] = offset
    if source_id is not None:
        params['source_id'] = source_id

    self.make_cmd('GET', 'news', params)

【问题讨论】:

  • 你为什么不用*args?
  • 你应该退后一步,问问自己为什么函数需要这么多参数。
  • 这看起来应该是某个 other 类的__init__ 方法。 (单看名字,我也怀疑make_cmd。)
  • @mkrieger1,我绝对同意你的看法。看来这个方法,因为他使用self作为第一个参数,所以参数太多了,这显然是一个代码问题。

标签: python python-3.x loops


【解决方案1】:

看起来所有参数都直接传递给make_cmd,所以为什么不使用关键字参数:

def news(self, **params):
    self.make_cmd('GET', 'news', params)

news(query="Test")

【讨论】:

  • 该死,又被打败了! +1
【解决方案2】:

我认为您定义的是方法而不是函数。以下将起作用:

def news(self, **kargs):
    params = kargs
    self.make_cmd('GET', 'news', params)

我想观察一下,您向您的方法传递了太多参数,这是一个名为Long Parameter List 的代码错误的明确信号。

【讨论】:

    【解决方案3】:

    这样可以吗:

    import inspect
    
    def news(self, query = None, instrument_id = None, days = None, news_lang = None, news_country = None, market_id = None, limit = None, offset = None, source_id = None):
        frame = inspect.currentframe()
        args, _, _, values = inspect.getargvalues(frame)
    
        params = {}
    
        for arg in args:
            if values[arg] is not None:
                params[arg] = values[arg]
    
        return params
    
    print(news(1,2,3))
    

    此解决方案的优点是您无需使用允许任何参数名称的 **kwargs 或 *args。

    【讨论】:

      【解决方案4】:

      如果这些参数的值不能是0、空列表或任何其他“虚假”的东西,那么您可以删除所有if 检查:

      params['query'] = query or None
      .
      .
      

      您也可以简单地接受**params 并将其传递给self.make_cmd:

      def news(self, **params):
          return self.make_cmd('GET', 'news', params)
      

      这种方法的缺点是它的自我记录较少,最终用户需要知道 kwargs news 接受什么。

      【讨论】:

        猜你喜欢
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 2021-10-02
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        相关资源
        最近更新 更多