Python中的str()方法适用于所有类型的参数吗?

时间:2018-12-22 17:30:52

标签: python

我正在尝试使用以下代码行引发错误消息:

def raise_error(value):
    error = "The value " + str(value) + " does not satisfy the given conditions."
    # Other stuff

该值基本上是从JSON API获得的用户输入,因此我正在尝试考虑所有可能性。如果使用str()方法不能将给定的值转换为字符串,上述方法本身会在我的系统中引起异常吗?如果是,那么将产生异常的值是什么?

2 个答案:

答案 0 :(得分:2)

str方法将始终产生输出,只是可能没有意义。如docs here中所述,根据定义,它调用__str____repr__。对于所有基本类型(例如int,float,bool等),您将获得不错的输出。对于自定义类,尽管您可能会得到一些垃圾,例如:

class test:
    pass

print(str(test()))

>>> <__main__.test object at 0x107f2ba20>

现在,如果您定义一个__str__方法,您将得到类似的东西

class test:
    def __str__(self):
        return "A test object"

print(str(test()))
>>> 'A test object'

答案 1 :(得分:2)

简短的回答:您不必担心。该字符串是由__str____repr__函数生成的,并且其中一个或两个都将自动在所有新对象和基元上创建。


但是从技术上讲,在某些情况下,开发人员可以做一些愚蠢的事情。


方案A) __str__函数不返回字符串:

class Test():
    def __str__(value):
        return

raise_error(Test())

这会导致错误

TypeError: __str__ returned non-string (type NoneType)


情形B) __str__函数的参数数量错误:

class Test():
    def __str__():
        return 0

raise_error(Test())

这会导致错误

TypeError: __str__() takes 0 positional arguments but 1 was given


很显然,在所有这三种情况下,故障都在于开发人员创建了错误的__str__函数。我认为我们都可以同意这些不是您的代码必须处理的情况。