最近,我试图在Python中存储和读取文件中的信息,并遇到了一个小问题:我想从文本文件中读取类型信息.从string到int或float的类型转换非常有效,但是从字符串到类型的类型转换似乎是另一个问题.当然,我尝试过这样的事情:
var_type = type('int')
Run Code Online (Sandbox Code Playgroud)
但是,type不是用作强制转换,而是用作查找变量类型的机制,这实际上就str在这里.
我找到了一种方法:
var_type = eval('int')
Run Code Online (Sandbox Code Playgroud)
但我一般尽量避免类似的功能/报表eval或exec在那里我可以.所以我的问题如下:是否有另一种pythonic(和更具体的)方法将字符串转换为类型?
小智 32
我喜欢使用locate,它适用于内置类型:
>>> from pydoc import locate
>>> locate('int')
<type 'int'>
>>> t = locate('int')
>>> t('1')
1
Run Code Online (Sandbox Code Playgroud)
......以及它在路径中可以找到的任何东西:
>>> locate('datetime.date')
<type 'datetime.date'>
>>> d = locate('datetime.date')
>>> d(2015, 4, 23)
datetime.date(2015, 4, 23)
Run Code Online (Sandbox Code Playgroud)
...包括您的自定义类型:
>>> locate('mypackage.model.base.BaseModel')
<class 'mypackage.model.base.BaseModel'>
>>> m = locate('mypackage.model.base.BaseModel')
>>> m()
<mypackage.model.base.BaseModel object at 0x1099f6c10>
Run Code Online (Sandbox Code Playgroud)
为什么不直接使用查找表?
known_types = {
'int': int,
'float': float,
'str': str
# etc
}
var_type = known_types['int']
Run Code Online (Sandbox Code Playgroud)
你对自己想要做的事情感到有点困惑.类型,也称为类,是对象,就像python中的其他所有东西一样.当您int在程序中编写时,您将引用一个名为int恰好是类的全局变量.你要做的不是"将字符串转换为类型",而是按名称访问内置变量.
一旦理解了这一点,就很容易看出解决方案:
def get_builtin(name):
return getattr(__builtins__, name)
Run Code Online (Sandbox Code Playgroud)
如果您真的想将类型名称转换为类型对象,请按照以下方式进行操作.我deque用来进行广度优先的树遍历而不进行递归.
def gettype(name):
from collections import deque
# q is short for "queue", here
q = deque([object])
while q:
t = q.popleft()
if t.__name__ == name:
return t
else:
print 'not', t
try:
# Keep looking!
q.extend(t.__subclasses__())
except TypeError:
# type.__subclasses__ needs an argument, for whatever reason.
if t is type:
continue
else:
raise
else:
raise ValueError('No such type: %r' % name)
Run Code Online (Sandbox Code Playgroud)
也许这就是您想要的,它仅查看内置类型:
def gettype(name):
t = getattr(__builtins__, name)
if isinstance(t, type):
return t
raise ValueError(name)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13097 次 |
| 最近记录: |