【问题标题】:Check 3 empty string variables from PyQT5 [duplicate]检查来自 PyQT5 的 3 个空字符串变量 [重复]
【发布时间】:2021-08-03 19:25:28
【问题描述】:

我正在尝试检查 3 个值是否等于 None,因为我想为我的 PyQT5 应用程序进行错误处理。 我已经尝试了所有可能的方法来检查值是否为空但仍然不是想要的结果。 目前我有 3 个 QLineEdit,我需要检查它们是否为空,但它总是显示不同的信息。

        self.name_edit = self.nameEdit.text()
        self.jobTitle_edit = self.jobTitleEdit.text()
        self.mob_edit = self.mobEdit.text()
        self.businessUnit = str(self.BusinessUnit.currentText())        

        check = [self.name_edit, self.jobTitle_edit, self.mob_edit]

        if check == None:
            data = "FailedNoInfo"
            self.windows2 = notifyWindow(data)
            print(self.nameEdit.text())
            print(self.mobEdit.text())
        else:
            ProcessData(data)
            print(self.nameEdit.text())
            print(self.mobEdit.text())
            print(self.jobTitleEdit.text())

这是我检查它们是否为空的最后一种方法,结果什么也没有。 有人知道为什么这会导致多个值出错,因为这工作正常,没有任何问题的 1 个值。

编辑 1

检查检查是否为 None 是愚蠢的,因为它不是空数组,但不是 None。但是,这里似乎没有任何工作一直停留在这个问题上。

【问题讨论】:

  • text() 方法永远不会返回 None。如果您想知道 所有三个 值是否为空,您可以使用if not any(check)。如果你想知道至少一个值是否为空,你可以if not all(check).

标签: python pyqt5


【解决方案1】:

这是错误的,因为您将列表与 None 值进行比较。

check = [1, 2, 3]
print(check == None)    # Outputs False

因此,您的 if 语句将始终输入 else 子句。


请注意,具有None 值的变量和具有空字符串值的变量是不同的东西:

var1 = None
var2 = ''
print(var1 == var2)    # Outputs False
  1. 如果要检查所有值是否都是None,可以使用
if all(value is None for value in (self.name_edit, self.jobTitle_edit, self.mob_edit)):
  1. 如果要检查所有值是否都是空字符串,可以使用
if all(not len(value) for value in (self.name_edit, self.jobTitle_edit, self.mob_edit)):
  1. 如果要检查所有值是None还是空字符串,可以使用
if not any((self.name_edit, self.jobTitle_edit, self.mob_edit)):

【讨论】:

  • 请注意,第二点是不必要的冗长:检查字符串的长度以检查它是否有内容是没有意义的,所以它可能只是 if all(not value for value in ...) 甚至更好的 if not all(value for value in ...),因为它不需要为每个项目添加否定。
  • 但是not value 也将包含None 值,第二点意味着只包含空字符串!!!我很抱歉。
  • Noo 问题谢谢您的回答
  • @enzo 抱歉,您的论点无效,原因有两个:1. OP 从 QLineEdit 获取这些值(always 返回一个字符串),因此不是问题。 2. 无论如何,即使假设列表中可能有None 值,您的not len(value) 也会引发TypeError 异常,因为None 没有长度。
  • @musicamante 1. 我不知道 PyQt,但由于 OP 添加了None 检查,我假设text() 可以返回None。 2.第二点是在text()只返回字符串的情况下添加的,这就是我添加第一点和第三点的原因。
【解决方案2】:

这里有两个误解:

  1. QLineEdit的text属性总是返回一个字符串,即使它是空的,空字符串是""不是None:李>
value = self.lineEdit.text()
print(value == None) # this will return False
print(value is None) # same as above
if not value:
    print('Empty string')
else:
    print(value)

请注意,官方 Style Guide for Python Code(又名 PEP-8)建议始终检查 isis not 是否有像 None 这样的单身人士。

  1. 一个列表就是一个列表,它不是None,不管它是空的还是它的所有项目都是None
myList = [None, None]
print(myList is None) # this will return False
myList = []
print(myList is None) # this too will return False

最后一点很重要:如前所述,即使是空的,空列表仍然是列表对象,而不是None(参见例如this 问题):None 不是抽象含义,它是一个非常具体和奇特的对象,从根本上意味着:这绝对什么都不是,不是“空的东西”,只是什么都没有
一个空盒子不是什么都不是,它仍然是一个盒子,不管它的内容是什么:事实上,你称它为空盒子,而不是“什么都没有”。

如果要检查所有项是否包含文本,则可以使用all

check = [self.name_edit, self.jobTitle_edit, self.mob_edit]
if not all(check):
    # some items are empty, since "not all" of them have contents
else:
    # go on...

或者,如果您想检查 所有 字符串是否为空(但仍要检查是否至少有任何字符串有内容),请使用any

if not any(check):
    # all strings are empty
elif not all(check):
    # *some* strings are empty
else:
    # all strings have text

【讨论】:

  • 感谢您的回答!但这也仍然没有任何区别,因为如果我尝试这个,它总是会转到 true 语句而不是 else 语句
  • @Blokhunt 你所说的“它总是会成为真实的陈述”是什么意思?
  • @musicmante 目前我有这个:check = [self.name_edit, self.jobTitle_edit, self.mob_edit] if all(check): print("All texts are empty") data = " FailedNoInfo" self.windows2 = notifyWindow(data) else: ProcessData(data) 但是总会去else语句创建对象ProccessData(data)
  • @Blokhunt 请仔细阅读:声明应为if not all(check):。您缺少 not。 Python 一直试图专注于 [English] 语言语法:这里的概念是您需要检查是否不是每个字段都有内容,因此:if not all。如果你做if all,则表示“检查所有字段是否有内容”。
  • 当我将其更改为“如果不是全部(检查)”时,它总是会将其解析为“所有字符串为空”的结果,所以真的很奇怪,它总是一个或另一个。
猜你喜欢
  • 2018-11-28
  • 2021-08-26
  • 2012-09-21
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2014-06-27
  • 2015-10-20
  • 2013-04-11
相关资源
最近更新 更多