Python match/case和type()命令的区别什么时候用哪个?

92dk7w1h  于 2023-08-02  发布在  Python
关注(0)|答案(3)|浏览(118)

我试图理解以下代码之间的区别以及每个代码存在什么用例。或者它们只是冗余代码?
代码1(使用match/case)

var = 0

match var:
     case str():
         print("string")
     case list():
         print("list")
     case float():
         print("float")
     case bool():
         print("boolean")
     case int():
         print("integer")
     case _:
         print("unknown")

字符串
这就给出了如下的输出

integer


代码2(使用type())

print(type(var))


这也给了我同样的输出,因为它应该

<class 'int'>


想知道这些可能有哪些不同的用例吗?

jgwigjjp

jgwigjjp1#

在两个代码片段中找到相似之处是很困难的!不过,我会一一描述。

# snippet one

match 0:
    case str():  # construct the empty string and see if it's 0
    case list():  # construct an empty list and see if it's 0
    case float():  # construct the zero float and see if it's 0
    case bool():  # construct the zero bool (false) and see if it's 0
    case int():  # construct the zero int and see if it's 0
        # it is, of course!
        print('integer')
    case _:  # if nothing else, do this

个字符
前者是一个控制语句--你可以在这些块中做任何事情。后者是一个生成类型int的语句。
考虑如下代码:

class Command:
    def __init__(self, cmd, verbose=False):
        self.cmd = cmd
        self.verbose = verbose

run_python = Command("python")
run_python_verbose = Command("python", verbose=True)

def execute_command(cmd: Command):
    match cmd:
        case Command(cmd="python"):
            print("Hey, you're running Python!")
        case Command(cmd=cmd, verbose=True):
            print(f"Running {cmd} verbosely!")
        case Command(cmd=cmd):
            print(f"Running {cmd} succinctly")

execute_command(run_python)
execute_command(run_python_verbose)


在这两种情况下,你都得到了"Hey, you're running Python!",因为Python匹配的是类中的字段,而python是这两种情况下的cmd字段。您不能用type进行这种模式匹配(您需要类似type(cmd) is Command and cmd.cmd == "python"的东西)

628mspwn

628mspwn2#

match不能动态扩展,这意味着您必须硬编码每个值。在某些情况下,这可能是有帮助的,例如向不熟悉编程的用户显示类型或错误。type()则返回示例的基类。在您的示例中,0是内置int类型的示例。
使用type占用的空间更少,此外,还可以与字典一起使用来替换match。由于matchcase是Python 3.10中的新成员,因此它们的支持可能有限。许多公司和生产环境仍将使用3.8。如果你确实需要硬编码不同的值,而不是match或if-elif-else,你可以使用字典来将键Map到值:

typesdict = {
   str: "string",
   int: "integer",
   # etc.
}

var = 0 # 0
vart = type(var) # int

typesdict.get(vart, default="Unknown") # returns "integer".

字符串
至于用例,typematch都有更微妙和复杂的特性,在这样的简单用例中可能不需要这些特性。type在面向对象编程范例中更常见,而match用于复杂的控制流场景。就我个人而言,我会使用type,因为无论您在哪个环境中工作,match都可能不受支持。
TL;DR:使用类型,以防止硬编码值和支持。

pkwftd7m

pkwftd7m3#

代码1(使用match/case)和代码2(使用type())都用于确定变量的数据类型。但是,它们在用例和行为方面存在一些差异。

代码1(使用匹配/大小写):

match是Python 3.10中引入的一个新特性。它允许您对表达式的值执行模式匹配。在给定的代码中,match用于模式匹配变量var的值,然后根据其数据类型执行相应的块。当您特别想要检查资料类型,并根据类型执行不同的动作时,这个程式码会很有帮助。当您要行程多个型别,而且想要避免使用多个if-elif-else陈述式时,这个方法特别有用。

代码2(使用类型()):

type()是Python中的一个内置函数,用于返回对象的类型。在给定的代码中,type(var)用于直接获取变量var的类型。当您只需要知道变量的类型时,此代码会更简单、更直接。您不必像在match/case语句中那样使用多个case块。但是,它不允许您直接根据类型执行不同的操作。您可能需要使用if-elif-else或其他条件语句来分别处理不同的类型。

使用案例:

代码1(使用match/case)在您希望根据变量的数据类型执行不同的操作时非常有用,尤其是在您要处理多个数据类型时。代码2(使用type())在您只需要知道变量的数据类型,而不需要根据类型执行不同的操作时很有用。

代码1的示例用例:

假设您有一个函数,它接收不同类型的输入,并且需要以不同的方式处理它们。您可以使用match来分别行程不同的资料类型。当解析具有动态数据类型的JSON或CSV文件时,match可以帮助您适当地处理每种数据类型。

代码2的示例用例:

在调试或分析代码时,您可能希望快速检查变量的类型以了解其行为。当您需要编写包含某些变量的数据类型信息的日志或报告时,可以使用type()来提取此信息。

相关问题