【问题标题】:Python: most idiomatic way to convert None to empty string?Python:将 None 转换为空字符串的最惯用方法?
【发布时间】:2010-11-05 07:05:30
【问题描述】:

执行以下操作最惯用的方法是什么?

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

更新:我正在采纳 Trypich 的使用 str(s) 的建议,这使得该例程适用于字符串以外的其他类型。我对 Vinay Sajip 的 lambda 建议印象深刻,但我想让我的代码保持相对简单。

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)

【问题讨论】:

  • 我喜欢你原来的语法。我认为它已经相当清晰易读了。
  • @GuiSim:我可能有偏见,但我的回答读起来几乎就像一个普通的英语句子......
  • "如果 s 为 None,则返回一个空字符串;否则,返回 [string of] s。"问题中的代码读起来也像正常的英语句子。
  • a) 如果字符串 s 来自未找到密钥的字典查找,则使用 dict.get(key, '')
  • b) 如果您只希望此字符串转换用于输出格式(例如打印),那么您可以直接执行 '... {}'.format(dict.get(1))`

标签: string python idioms


【解决方案1】:

可能最短的是 str(s or '')

因为 None 为 False,如果 x 为 false,“x or y”返回 y。有关详细说明,请参阅Boolean Operators。它很短,但不是很明确。

【讨论】:

  • 这太好了,谢谢!从来没想过这样使用or
  • 如果s 为 0、False 或任何虚假值,则此方法不起作用
  • 好吧,这在操作的要求中没有提到,所以我在这里看不到你的意思。
  • @dorvak OP 非常明确地要求输出应该是'' iff s is None。所有其他输入应返回s(或修改后的请求中的str(s))。
  • @fortea:那行不通。如果sNone,则xstr() 的结果应该是一个空字符串,但str(None) 给出了字符串"None",这就是返回的内容(因为字符串"None" 不是假值。
【解决方案2】:
def xstr(s):
    return '' if s is None else str(s)

【讨论】:

  • 此语法在 2.5 中引入;对于早期版本的 Python,您可以使用return s is not None and s or ''
  • 我会转过来强调更常见的情况:如果 s 不是其他情况,则返回 s ""
  • @Ber:我会保持原样,以避免双重否定。
  • 这是一个很好的例子,说明了.. and .. or .. 如何失败以及为什么首选 if-else。 s is not None and s or '' 中有两个细微的错误。
  • return '' if not s else str(s)
【解决方案3】:

如果您确实希望您的函数表现得像 str() 内置函数,但在参数为 None 时返回一个空字符串,请执行以下操作:

def xstr(s):
    if s is None:
        return ''
    return str(s)

【讨论】:

  • 我保留了 else,但感谢 str(s) 提示,因此可以处理多种类型。不错!
  • 或者干脆xstr = lambda s: '' if s is None else str(s)
  • 我喜欢输入 if not s: 而不是 if s is None
  • @guneysus 他们不一样:not False == TrueFalse is None == False
  • 谢谢@Lynn,你是对的。我意识到了我的错。但我知道(或假设)s 始终是 str/unicode 类型或None。是的,False 是一个值,但我更喜欢这种节省键盘和眼睛的方式;)
【解决方案4】:

如果您知道该值将始终是字符串或无:

xstr = lambda s: s or ""

print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''

【讨论】:

  • 迄今为止最pythonic的。使用 python 将 None、空列表、空字符串、0 等视为 false 的事实。还使用 or 语句返回第一个为 true 的元素或给定 or(或 ors 组)的最后一个元素这一事实。这也使用 lambda 函数。我会给你+10,但显然它不会让我。
  • 这将转换 0 和 False(以及传递给 bool() 时评估为 False 的任何其他内容)
  • 我不认为它是“迄今为止最pythonic”。这是其他语言中的常见习语,我认为在 Python 中使用它并没有错,但是为了避免这样的技巧,精确地引入了条件表达式。
  • 这使得[]{} 等得到与None 相同的结果,这是不希望的。 xstr(False) 尤其应该是 "False" 而不是 ""。滥用 lambdas 是一个糟糕的例子,使用def xstr(s): return s or "" ir 你想把它全部放在一行上。
  • 请注意,我在一开始就用“如果您知道该值将始终是字符串或无”来限定我的答案。
【解决方案5】:

return s or '' 可以很好地解决您提出的问题!

【讨论】:

  • 值得注意的是,当 s 为 False 或 0 时,这将给出不同的结果(这不是原始字符串问题,而是更新后的问题。)
  • @Oddthinking s = Falses = 0 在它的使用中很可能是一个边缘情况,可以通过将其写为 return str(s or '') 来轻松缓解
  • @WillemvanKetwich:这有完全相同的问题:s(False) 应该返回 'False',而不是 ''。 s(0) 应该返回 '0',而不是 ''。对于定义 __bool__ 或 __nonzero__ 的对象也是如此。
  • @Oddthinking 我明白你的意思。无论如何,如果它专门用于字符串对象,例如在 OP 的问题中,它不应该是一个问题。
  • @WillemvanKetwich:查看更新后的问题和我评论中的警告 - 这已被涵盖,
【解决方案6】:
def xstr(s):
   return s or ""

【讨论】:

  • 这将返回 ''0[]{}False 和类似假的值,这不是发帖人要求的。
  • 只需将 str([...]) 放在 s 周围:def xstr(s): return str(s) or ""
【解决方案7】:

功能方式(单线)

xstr = lambda s: '' if s is None else s

【讨论】:

  • "def xstr(s): return '' if s is None else s " 也是一个联机,毕竟python 对空格没有那么严格
  • 这不是真正的单行,它只是写在一行g
  • 在什么意义上它不是一个真正的在线人?检查您的解释器 - 这不是语法错误。出于所有意图和目的,它比 lambda 更真实 ^_^
  • PEP 8 种,您应该使用 def 而不是将 lambda 分配给变量。 lambda 唯一真正的优势是您可以编写为表达式的一部分(例如传递给另一个函数),而这种优势在这样的代码中丢失了。我以前也这样做,直到我注意到 def 可以写在一行中,然后 PEP 8 向我展示了要走的路。永远追随巨蟒之神。
【解决方案8】:

在其他一些答案的基础上进行此构建的简洁单线:

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

甚至只是:

s = (a or '') + (b or '')

【讨论】:

  • 为什么还要提到(lambda v: v or '')
  • 为什么不呢? 1 价格的 2 小贴士! ?
  • 请注意False和空列表也会变成''。
  • 0 等也一样
【解决方案9】:

更新:

我现在主要用这个方法:

some_string = None
some_string or ''

如果 some_string 不是NoneTypeor 将在那里短路并返回,否则返回空字符串。

旧:

Max 函数在 python 2.x 中有效,但在 3.x 中无效:

max(None, '')  # Returns blank
max("Hello", '') # Returns Hello

【讨论】:

  • 之所以有效,是因为 'str' > 'NoneType',并且是特定于 CPython 的。来自manual:“除数字之外的不同类型的对象按其类型名称排序”。此外,这在 Python 3000 中不起作用,因为不再允许进行类型间比较(TypeError: unorderable types: str() > NoneType())。见How does Python compare string and int?
  • 很高兴知道谢谢,所以使用 python 3.x 兼容代码前进不是一个好主意。
【解决方案10】:
def xstr(s):
    return {None:''}.get(s, s)

【讨论】:

  • 我认为,它是相当 Python 的——这个怎么样:“xstr = lambda s : {None:''}.get(s,s)”——将整个事情简化为单线。
  • 不必要的慢(额外的字典构造和查找),并且更难阅读。非常不合常理。
  • 你是对的。它相当失败,但它避免了 python 字节码中的条件跳转。
  • get() 函数调用意味着至少有一个额外的条件跳转。
  • 如果不知道问题或查找get,我将无法说出这应该做什么。
【解决方案11】:

如果您需要与 Python 2.4 兼容,请根据上述变体

xstr = lambda s: s is not None and s or ''

【讨论】:

    【解决方案12】:

    如果是关于格式化字符串,你可以这样做:

    from string import Formatter
    
    class NoneAsEmptyFormatter(Formatter):
        def get_value(self, key, args, kwargs):
            v = super().get_value(key, args, kwargs)
            return '' if v is None else v
    
    fmt = NoneAsEmptyFormatter()
    s = fmt.format('{}{}', a, b)
    

    【讨论】:

      【解决方案13】:
      def xstr(s):
          return s if s else ''
      
      s = "%s%s" % (xstr(a), xstr(b))
      

      【讨论】:

      • 这将为所有类似假的值返回一个空字符串,这不是发帖人要求的。
      【解决方案14】:

      我们总是可以避免在下面解释的场景中进行类型转换。

      customer = "John"
      name = str(customer)
      if name is None
         print "Name is blank"
      else: 
         print "Customer name : " + name
      

      在上面的示例中,如果变量 customer 的值为 None,它会在分配给“name”时进一步进行转换。 'if' 子句中的比较总是会失败。

      customer = "John" # even though its None still it will work properly.
      name = customer
      if name is None
         print "Name is blank"
      else: 
         print "Customer name : " + str(name)
      

      上面的例子可以正常工作。当从 URL、JSON 或 XML 中获取值甚至值需要进一步类型转换以进行任何操作时,这种情况非常常见。

      【讨论】:

        【解决方案15】:

        使用短路评估:

        s = a or '' + b or ''
        

        由于+对字符串的操作不是很好,最好使用格式字符串:

        s = "%s%s" % (a or '', b or '')
        

        【讨论】:

        • 这也会将'a'转换为所有类似假的值的空字符串,而不仅仅是None。例如,空元组、列表和字典将转换为空字符串,这不是 OP 指定的。
        • + 是两个字符串的完美运算符。当您尝试使用它加入数十个时,您就会遇到麻烦。对于两个,它可能会比其他选项更快;无论哪种方式,它都在噪音中。
        • +1 对我来说,因为这正是我所需要的:lambda 或替换 single 运算符 (or) 的函数对于我...我没有其他错误值的案例-str 或None。除了对+ 运算符的评论(可能取决于特定场景并可能需要基准测试)之外,这个答案确实值得-1
        【解决方案16】:

        如果您使用的是 python v3.7,请使用 F 字符串

        xstr = F"{s}"
        

        【讨论】:

        • 这是错误的,如果sNone,则返回字符串'None'
        猜你喜欢
        • 2014-12-16
        • 2017-12-30
        • 2011-07-10
        • 1970-01-01
        • 2021-02-17
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        相关资源
        最近更新 更多