【问题标题】:Pythonic way to check same key for upper/lower case in dictionary or raise errorPythonic 方法检查字典中大写/小写的相同键或引发错误
【发布时间】:2023-02-07 23:57:44
【问题描述】:

我想知道这是否正确和 pythonic:

def get_value_from_lowered_key(variant: dict, lowered_key: str) -> Any:
"""
Given a lowered key, retrieves the value for the lower/upper key if exist
"""
    try:
        return variant[lowered_key]
    except KeyError:
        try:
            return variant[lowered_key.upper()]
        except KeyError:
            raise KeyError(f"Variant {str(variant)} has not the lower/upper key {lowered_key}")

非常感谢!

【问题讨论】:

    标签: python python-3.x dictionary try-catch


    【解决方案1】:

    你可以做类似的事情(在 Python > 3.10 中)

    def get_value_from_lowered_key(variant: dict, lowered_key: str) -> Any:
    """
    Given a lowered key, retrieves the value for the lower/upper key if exist
    """
        if ((key:=lowered_key) in variant) or ((key:=lowered_key.upper()) in variant):
    
            return variant[key]
        raise KeyError(f"Variant {str(variant)} has not the lower/upper key {lowered_key}")
    

    这是有效的,因为在 Python 中,如果 or 表达式中的第一个语句为 True,则不会评估其余部分,因此 key 要么被分配正常值,要么如果不在字典中,则使用降低的版本。

    【讨论】:

    • Python 3.8 版,不能这样!
    【解决方案2】:

    如果这是正确的

    看不见要求我不能说,如果它确实按照要求行事,那么是的。

    蟒蛇式的

    我将您的代码放入 getvalue.py 文件并使用 flake8 检查您的代码是否符合 PEP-8。

    getvalue.py:2:1: E305 expected 2 blank lines after class or function definition, found 0
    getvalue.py:2:1: E112 expected an indented block
    getvalue.py:2:1: E999 IndentationError: expected an indented block
    getvalue.py:5:5: E113 unexpected indentation
    getvalue.py:11:80: E501 line too long (95 > 79 characters)
    

    所以你的代码至少不符合 PEP-8。

    【讨论】:

      【解决方案3】:

      我可能会在这里使用get()来做:

      def get_value_from_lowered_key(variant: dict, lowered_key: str) -> Any:
          return variant.get(lowered_key, variant[lowered_key.upper()])
      

      如果你想提高你自己的KeyError版本:

      def get_value_from_lowered_key(variant: dict, lowered_key: str) -> Any:
          try:
              return variant.get(lowered_key, variant[lowered_key.upper()])
          except KeyError:
              raise KeyError(f"Variant {str(variant)} has not the lower/upper key {lowered_key}")
      

      【讨论】:

      • 我需要提出一个错误
      • 如果密钥的两个版本都不存在,这将引发 KeyError 但如果您想引发自定义错误,您可以将返回放入 try
      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      相关资源
      最近更新 更多