【问题标题】:Change values of a python dictionary contigent on the other values of the dictionary根据字典的其他值更改 python 字典的值
【发布时间】:2012-01-18 17:57:50
【问题描述】:

是否有可能使默认输入值依赖于其中一个输入值?我试过这个:

def getHigh(pricedata, start=min(pricedata), end=max(pricedata)):
    ## do something

但它不起作用,因为 pricedata 尚未定义。

【问题讨论】:

  • 我建议不要在函数参数中做任何超级高级的事情,而是在函数体中,你可以在其中正确定义它。
  • 感谢您的回答。他们真的是一个很大的帮助。可能对我来说最好坚持简单明了的答案。

标签: python default-value


【解决方案1】:

保持简单:)

def getHigh(pricedata, start=None, end=None):
    start = min(pricedata) if start is None else start
    end = max(pricedata) if end is None else end

【讨论】:

    【解决方案2】:

    按照您的要求进行操作的两种方法是:

    def getHigh(pricedata, start=None, end=None):
        if start is None:
            start = min(pricedata)
        if end is None:
            end = max(pricedata)
    

    还有……

    def getHigh(pricedata, **kwargs):
        start = kwargs.get("start", min(pricedata))
        end = kwargs.get("end",max(pricedata))
    

    【讨论】:

    • 第二种解决方案的问题是该函数将接受任何命名参数并且如果不使用它们也不会抱怨。可以使用 .pop() 而不是 .get() 并检查 dict 是否为空。
    • 嗯,它确实会接受任何命名参数,但我不确定为什么这会导致问题,一般来说(我的意思是,我能想到的唯一情况是如果你正在将**kwargs 传递给另一个函数,而您试图屏蔽该调用)。它不会污染您的命名空间,并且忽略它们是安全的。我很想知道您认为这会导致什么具体问题。
    • 使用关键字参数的一个问题是help() 和其他自动化文档工具不会告诉您函数接受哪些参数。这可能是也可能不是什么大问题。此外,当可能不需要时,它要求可选参数作为关键字参数传递。
    【解决方案3】:

    在一般情况下,您可以使用None 执行此操作并对其进行测试。

    def getHigh(pricedata, start=None, end=None):
        start = min(pricedata) if start is None else start
        end   = max(pricedata) if end is None else end
    

    在您设置范围并且仅处理该范围内的项目的特定情况下,您可以使用包含所有可能值的默认值:

    def getHigh(pricedata, start=float("-inf"), end=float("+inf")):
        # consider only items between start and end, inclusive
        pricedata = [datum for datum in pricedata if start <= datum <= end]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2022-01-12
      • 2018-04-07
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多