在Python中断言变量类型的正确方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中断言变量类型的正确方法相关的知识,希望对你有一定的参考价值。

使用函数时,我希望确保变量的类型符合预期。如何正确执行?

这是一个伪函数示例,尝试在继续其作用之前执行此操作:

def my_print(begin, text, end):
    """Print 'text' in UPPER between 'begin' and 'end' in lower

    """
    for i in (begin, text, end):
        assert isinstance(i, str), "Input variables should be strings"
    out = begin.lower() + text.upper() + end.lower()
    print out

def test():
    """Put your test cases here!

    """
    assert my_print("asdf", "fssfpoie", "fsodf")
    assert not my_print("fasdf", 33, "adfas")
    print "All tests passed"

test()

是否主张正确的方法?我应该改用try / except吗?

而且,我断言的一组测试似乎无法正常工作:S

感谢pythoneers

答案

isinstance内置是您真正必须的首选方式,但是更好的是记住Python的座右铭:“宽恕比许可要容易得多!!-)(实际上是Grace Murray Hopper最喜欢的座右铭;- )。即:

isinstance

顺便说一句,顺便说一句,该函数可以在Unicode字符串上正常工作-无需任何额外的工作!-)

另一答案

您可能想为2.6版的Python尝试此示例。

def my_print(text, begin, end):
    "Print 'text' in UPPER between 'begin' and 'end' in lower"
    try:
      print begin.lower() + text.upper() + end.lower()
    except (AttributeError, TypeError):
      raise AssertionError('Input variables should be strings')

但是,您是否考虑过让函数自然失败?

另一答案

执行def my_print(text, begin, end): "Print text in UPPER between 'begin' and 'end' in lower." for obj in (text, begin, end): assert isinstance(obj, str), 'Argument of wrong type!' print begin.lower() + text.upper() + end.lower() 实际上等效于type('')str

所以types.StringType将计算为“ type('') == str == types.StringType”]

[请注意,如果仅通过这种方式检查类型,则仅包含ASCII的Unicode字符串将失败,因此您可能需要执行Trueassert type(s) in (str, unicode)之类的操作,其中的后者由007Brendan在注释中建议,可能是首选。

[assert isinstance(obj, basestring)很有用,如果您想问一个对象是否是一个类的实例,例如:

isinstance()

但是对于基本类型,例如询问class MyClass: pass print isinstance(MyClass(), MyClass) # -> True print isinstance(MyClass, MyClass()) # -> TypeError exception strunicodeintfloatlong等将可以正常工作。

以上是关于在Python中断言变量类型的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript-基础-08-类型断言

Swift入门——可选类型(Optionals)与断言(Assert)

Swift入门——可选类型(Optionals)与断言(Assert)

typeScript-基础知识-4-8类型断言

interface变量存储类型

Go-动态类型与类型断言详解(含type-switch及全部代码)