【问题标题】:Identifying the data type of an input识别输入的数据类型
【发布时间】:2014-04-07 15:04:47
【问题描述】:

您好,我正在尝试打印用户输入的数据类型并生成如下表格:

ABCDEFGH = 字符串, 1.09 = 浮点数,0 = int,true = bool

等。 我正在使用 python 3.2.3,我知道我可以使用 type() 来获取数据的类型,但是在 python 中,所有用户输入都被视为字符串,我不知道如何确定输入是字符串还是布尔值或整数或浮点数。这是那部分代码:

user_var = input("Please enter something: ")
print("you entered " + user_var)
print(type(user_var))

总是返回 str 作为字符串。 感谢任何帮助

【问题讨论】:

    标签: python python-3.x types user-input python-3.2


    【解决方案1】:

    这里的问题是任何输入都是“字符串”。因此,我们需要将“字符串”视为一种特殊情况,并将其与其他所有内容分开。

    x = input("Enter something: ")
    
    try:
        if type(eval(x)) == float:
            print(x, " is floating point number")
        elif type(eval(x)) == int:
            print(x, " is interger number")    
        elif type(eval(x)) == bool:
            print(x, " is a boolean")      
    except:
        print("That is a string")
    

    这里首先评估输入。如果它不是字符串,则 eval 函数应显示类型。如果是字符串,则认为是“错误”,错误信息为“That is a string”。

    【讨论】:

      【解决方案2】:
      from ast import literal_eval
      
      def get_type(input_data):
          try:
              return type(literal_eval(input_data))
          except (ValueError, SyntaxError):
              # A string, so return str
              return str
      
      print(get_type("1"))        # <class 'int'>
      print(get_type("1.2354"))   # <class 'float'>
      print(get_type("True"))     # <class 'bool'>
      print(get_type("abcd"))     # <class 'str'>
      

      【讨论】:

      • 我喜欢这个答案,但我认为发帖人想打印输入字符串的评估类型,而不是评估值
      • 现在的问题似乎是“try”语句被忽略了,并且没有打印语句中的任何内容
      • @ApeironKambyses 您能用您更改的代码更新问题吗?
      • 只有布尔值仍被视为字符串。有什么想法吗?
      • @ApeironKambyses 布尔值的首字母大写吗?
      【解决方案3】:

      input() 将始终返回一个字符串。如果您想查看是否可以转换为整数,您应该这样做:

      try:
          int_user_var = int(user_var)
      except ValueError:
          pass # this is not an integer
      

      你可以这样写一个函数:

      def try_convert(s):
          try:
              return int(s)
          except ValueError:
              try:
                  return float(s)
              except ValueError:
                  try:
                      return bool(s)
                  except ValueError:
                      return s
      

      但是,正如其他答案中提到的,使用 ast.literal_eval 将是一个更简洁的解决方案。

      【讨论】:

      • 我是否必须使用“if 语句”来确定每种类型并尝试将它们转换为布尔值、浮点数等?
      • 是的,你必须这样做。
      • 对于每个非空字符串,bool(s)True。如果没有literal_eval,您将不得不对"True""False" 使用字符串比较。
      • 谢谢大家。你们都非常有帮助
      【解决方案4】:

      输入总是返回一个字符串。您需要评估字符串以获得一些 Python 值:

      >>> type(eval(raw_input()))
      23423
      <type 'int'>
      >>> type(eval(raw_input()))
      "asdas"
      <type 'str'>
      >>> type(eval(raw_input()))
      1.09
      <type 'float'>
      >>> type(eval(raw_input()))
      True
      <type 'bool'>
      

      如果你想要安全(这里用户可以执行任意代码),你应该使用ast.literal_eval

      >>> import ast
      >>> type(ast.literal_eval(raw_input()))
      342
      <type 'int'>
      >>> type(ast.literal_eval(raw_input()))
      "asd"
      <type 'str'>
      

      【讨论】:

      • 来自问题I'm using python 3.2.3
      • 如果用户输入的是import os; os.system("rm -rf *"),这是非常危险的。
      • @TomLeese 不,不是,你可能想的是exec 而不是eval
      • 好的,你说得对,你不能import os,但如果os.system("rm -rf *")已经被导入,你仍然可以运行。
      • @Tom Leese:看我的编辑。我一开始没有写它,因为我不记得在模块中literal_eval 函数是。
      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多