【问题标题】:if let syntax in PythonPython 中的 if let 语法
【发布时间】:2017-11-15 05:10:45
【问题描述】:

来自 Swift,我在使用 .None 类型的 Python 时遇到了一些困难。如果在数组中找不到我要查找的对象,我有一些函数可能会返回 None

然后我必须嵌套我的代码如下:

varA = self.getVariableByName(Variables.varA) 
if varA is None: 
    varB = self.getVariableByName(Variables.varB)
    varC = self.getVariableByName(Variables.varC) 
    if varB is not None and varC is not None: 
        # Do something with varB and varC 

在 Swift 中,我曾经能够在 if 语句中绑定变量

let f = getVariableByName
if f(Variables.varA) == nil, let varB = f(Variables.varB), let varC = f(Variables.varC) {
    // Do something with varB and varC
}

处理None 的更“pythonic”方式是什么?

【问题讨论】:

  • 这在某种程度上取决于你想用varBvarC“做什么”…try: ... except TypeError: ... 可能是一种pythonic 方法。
  • 我只想尽可能少地嵌套代码并使用尽可能少的行。大多数时候,当使用相同的函数来检索变量时,它可以被缩短,但我不知道如何在 Python 中做到这一点(在 if 语句中绑定是不可能的)。至于什么 varB 和 varC,这两个将结合其中的一些属性来制作模拟的 varA,但我留下了实现/变量名称以直接解决问题
  • 看看你在做什么,看来这可能是重载 [ ]in 运算符并在你的类中实现 __getitem____contains__ 方法的情况。跨度>
  • @cdarke:完美!我找到了这个链接来补充你的建议:stackoverflow.com/questions/2217001/…
  • 检查一下它可能会给你一个解释。 stackoverflow.com/questions/19473185/what-is-a-none-value

标签: python


【解决方案1】:

你可以使用“:=”操作符:

if varB := getVariableByName(Variables.varB):
    pass

【讨论】:

    【解决方案2】:

    我认为处理这种情况最好的方法是异常处理。 例如。如果未找到该元素,则使 self.getVariableByName 引发异常。然后你可以这样做:

    try:
        varA = self.getVariableByName(Variables.varA)
    except RuntimeError:
        varB = self.getVariableByName(Variables.varB)
        varC = self.getVariableByName(Variables.varC)
        # do something with varB and varC
    

    获得与您的 Swift 示例等效的内容。

    如果你不能/不想改变self.getVariableByName,你能做的最好的就是:

    f = self.getVariableByName
    if f(Variables.varA):
        varB, varC = f(Variables.varB), f(Variables.varC)
        if not (varB is None or varC is None):
            # do something with varB and varC
    

    【讨论】:

    • if-let 语句在 Swift 中自动解包 Optional,varB 和 varC 是 Variable? 类型的可选项。如果其中任何一个是.None 类型(nill),则不执行 if 语句。因此,如果您在 if 主体内,则 varB 和 varC 必须有一个值。
    【解决方案3】:

    您可以使用 python 3.8 及更高版本中的walrus operator (:=) 将赋值语句变为表达式。然后你可以在if语句中检查赋值是否导致None来决定是否继续。

    if (var_a := self.get_variable_by_name(Variables.var_a)) is not None:
        var_b = self.get_variable_by_name(Variables.var_b)
        var_c = self.get_variable_by_name(Variables.var_c)
        if var_b is not None and var_c is not None:
            # Do stuff...
    

    【讨论】:

      【解决方案4】:
      if not hasattr(Variables, 'varA'):
        varB = Variables.varB
      

      但可以肯定varB可能会丢失,所以最好检查是否有这样的属性或使用getattr()默认值或捕获AttributeError异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 2018-09-16
        • 2015-02-16
        • 2016-08-15
        • 2018-03-25
        • 2014-03-29
        • 2019-04-16
        相关资源
        最近更新 更多