S.M*_* sh 29 python string casting python-3.x
我想知道是否转换为字符串即str(sth)
可以引发异常,例如float(sth)
吗?我要求知道是否有必要将我的代码包装在:
try:
x = str(value)
except ValueError:
x = None
Run Code Online (Sandbox Code Playgroud)
确保执行不会因转换失败而停止.
这在Python 2和3中也有所不同,因为它们的str
类不同吗?
Jim*_*ard 28
如果你遇到的是明确提出了在异常的自定义类__str__
(或者__repr__
,如果__str__
没有定义).或者,例如,bytes
从__str__
以下位置返回对象的类:
class Foo:
def __str__(self):
return b''
str(Foo()) # TypeError: __str__ returned non-string (type bytes)
Run Code Online (Sandbox Code Playgroud)
但就个人而言,我从未见过这一点,我很确定没有人有这个; 这样做是愚蠢的.同样,实施__str__
或边缘案件中的一个愚蠢错误可能会产生另一个错误Exception
.有趣的是看看如何将Python推向这些边缘情况(在这里查看@ user2357112答案).
除了这种情况,在这种情况下,没有内置函数通常会引发异常,因为它是在Py2
和中为它们所有定义的Py3
.
对于用户定义的类,默认情况下str
将使用object.__str__
,如果未在Python 3中定义,则在Python 2中,如果类是新样式类(继承自object
),则使用它.
如果一个类是旧样式类,我相信它是classobj.__str__
用于类和instance.__str__
实例的.
一般来说,我不会抓住这个,特殊情况对此不够特别.
Jam*_*mes 19
理论上是的,它可以,但在实践中几乎肯定不会.该方式str
功能的工作原理是,它调用__str__
,它的转换为字符串对象的功能.内置类型,如List
数字类型,和其他类型将返回有关您期望的值,[x,y,z]
a List
,数字作为数字类型的字符串等,object
有一个__str__
方法,给出一个输出<generator object <genexpr> at 0x7fdb2fa6a640>
,通常不是很有用但不会引发例外.
因此,调用str
任何内置函数几乎肯定不会引发异常(不可否认,我在Python文档中找不到这方面的保证,但我无法想象它会发生的情况)
也就是说,可以覆盖__str__
自定义类的方法.如果这样做,那么该方法可能会引发异常,就像程序员可以编写的任何其他函数一样 - 故意例外,未被捕获IndexError
等等.即使你没有覆盖__str__
,如果你正在使用这样做的模块,该模块的作者完全有可能在一些罕见的边缘上犯了一些错误,这会产生异常.
底线:如果每个人都完成了他们的工作,那就不应该,但它可以.在几乎任何实际情况下,我都不会费心去尝试/捕捉.
use*_*ica 19
容易.你可以有一个带递归不安全的容器类,__str__
或者__repr__
最终在一个引用循环中:
import numpy
x = numpy.empty([1], dtype=object)
x[0] = x
str(x) # RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)
或者只是一个非常高度嵌套的对象:
x = []
for i in xrange(2000):
x = [x]
str(x) # RuntimeError: maximum recursion depth exceeded while getting the repr of a list
Run Code Online (Sandbox Code Playgroud)
哎呀,即使只是内置类型,你可能会遇到比异常更糟糕的事情:
x = {}
for i in range(1000000):
x = {1: x}
str(x) # python.exe has stopped working
# Windows can check online for a solution to the problem.
Run Code Online (Sandbox Code Playgroud)
那是一个C堆栈溢出,因为dict_repr
(目前)没有使用Py_EnterRecursiveCall
.你不能用块来抓住它except
!
回到更普通的错误,你可以得到weakref.proxy
一个死对象:
import weakref
class Foo(object):
pass
str(weakref.proxy(Foo())) # ReferenceError: weakly-referenced object no longer exists
Run Code Online (Sandbox Code Playgroud)
或者你可以写一个提升你想要的东西__str__
或者__repr__
:
class Foo(object):
def __str__(self):
raise Exception
str(Foo()) # Raises an Exception
Run Code Online (Sandbox Code Playgroud)
特定于Python 2,您可以得到一个print
对象产生部分输出然后引发异常的情况,即使它表面上应该从未到达打印任何东西的阶段:
class Foo(object):
def __repr__(self):
raise Exception
print [Foo()] # Prints a single opening bracket, then raises an Exception!
Run Code Online (Sandbox Code Playgroud)
这是由于过时的tp_print
C级钩子.
UnicodeEncodeError
在str
使用unicode
包含非ASCII字符的对象时,您还可以获得特定于Python 2的内容,因为Python 2 str
对象是字节串:
str(u'\u1000') # Fails on Python 2 only
Run Code Online (Sandbox Code Playgroud)
Chr*_*nds 10
只是为了添加其他答案,str()
不会在许多(可能是令人惊讶的)上下文中抛出异常,例如,您可以将其应用于函数,生成器或其自身.但是,我无法想象你实际上想要在实践中这样做的情况.
>>> def a(): pass
...
>>> str(a)
'<function a at 0x7fc43614e048>'
>>>
>>> str(x for x in range(3))
'<generator object <genexpr> at 0x7fc434b95f10>'
>>>
>>> str(str())
''
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2931 次 |
最近记录: |