Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找比'dir'更好的数据检查器`_Python - Fatal编程技术网

Python 寻找比'dir'更好的数据检查器`

Python 寻找比'dir'更好的数据检查器`,python,Python,可能重复: 在交互式python会话中,我大量使用dir函数来了解对象的结构。不幸的是,dir只显示属性的名称,而不显示属性的值,因此它的信息量远远不够。此外,dir的打印输出不会试图格式化输出以便于阅读(IOW:dir不要进行“漂亮的打印”) 在哪里可以找到信息量更大、格式更好的“现成”数据检查实用程序,dir 例如,dir的一个更有用的替代方法是打印与每个属性相关联的值(根据需要适当格式化),并格式化此输出以便于阅读。对于其值可调用的属性,它将打印其签名和/或docstring的第一行 谢

可能重复:

在交互式python会话中,我大量使用
dir
函数来了解对象的结构。不幸的是,
dir
只显示属性的名称,而不显示属性的值,因此它的信息量远远不够。此外,
dir
的打印输出不会试图格式化输出以便于阅读(IOW:
dir
不要进行“漂亮的打印”)

在哪里可以找到信息量更大、格式更好的“现成”数据检查实用程序,
dir

例如,
dir
的一个更有用的替代方法是打印与每个属性相关联的值(根据需要适当格式化),并格式化此输出以便于阅读。对于其值可调用的属性,它将打印其签名和/或docstring的第一行


谢谢

试试inspect模块,它可以为您提供各种信息,包括函数的原始源代码、堆栈帧等:

>>> class Foo:
...     def __init__(self, a, b, c):
...             self.a = a
...             self.b = b
...             self.c = c
...     def foobar(self):
...             return 100
... 
>>> f = Foo(50, 'abc', 2.5)
>>> import inspect
>>> inspect.getmembers(f)
[('__doc__', None), ('__init__', <bound method Foo.__init__ of <__main__.Foo instance at     0x7f0d76c440e0>>), ('__module__', '__main__'), ('a', 50), ('b', 'abc'), ('c', 2.5), ('foobar', <bound method Foo.foobar of <__main__.Foo instance at 0x7f0d76c440e0>>)]
>>> 
>>> def add5(x):
...     """adds 5 to arg"""
...     return 5 + x
... 
>>> inspect.getdoc(add5)
'adds 5 to arg'
>>> # What arguments does add5 take?
>>> inspect.getargspec(add5)
ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
>>> # Format that nicely...
>>> inspect.formatargspec(inspect.getargspec(add5))
'((x,), None, None, None)'
>>> 
>>类Foo:
...     定义初始化(self,a,b,c):
...             self.a=a
...             self.b=b
...             self.c=c
...     def foobar(自我):
...             返回100
... 
>>>f=Foo(50,'abc',2.5)
>>>进口检验
>>>检查。获取成员(f)
[(“文件”无)、(“初始文件”)、(“模块”、“主文件”)、(“a”、50)、(“b”、“abc”)、(“c”、2.5)、(“foobar”)]
>>> 
>>>def add5(x):
...     “”“将5添加到参数”“”
...     返回5+x
... 
>>>检查getdoc(add5)
'将5添加到参数'
>>>#add5采用什么参数?
>>>检查。getargspec(添加5)
ArgSpec(args=['x'],varargs=None,keywords=None,defaults=None)
>>>#很好地设置格式。。。
>>>inspect.formatargspec(inspect.getargspec(add5))
“((x),无,无,无”
>>> 
退房

如果“对象的结构”是指对象的实例属性,请注意,
dir
(something)调用something
,如果存在名为
\uuu dir()
的用户定义方法,否则,它将检查某物
\uuuu dict\uuuu
某物的类型(我想它随后会调用类型的
\uu dir\uuu()
或检查类型的
\uu dict\uu

因此,我相信对象的实例属性是由其
\uu dict\uu
属性给出的

但有些对象没有实例属性,例如整数

因此,我认为如果你测试一个对象的
\uuuu dict\uuuu
属性的存在性,如果它存在,获取它的值将为你提供你需要获得的东西:不仅是属性的名称,还有这样命名的对象

因为您要求对输出进行格式化,所以我用cPickle给出了这个示例(模块是一个对象,就像Python中的一切一样)

结果

load                       -->  <built-in function load>
PicklingError              -->  <class 'cPickle.PicklingError'>
__version__                -->  '1.71'
UnpickleableError          -->  <class 'cPickle.UnpickleableError'>
dump                       -->  <built-in function dump>
__builtins__               -->  <module '__builtin__' (built-in)>
Unpickler                  -->  <built-in function Unpickler>
compatible_formats         -->  ['1.0', '1.1', '1.2', '1.3', '2.0']
BadPickleGet               -->  <class 'cPickle.BadPickleGet'>
__package__                -->  None
dumps                      -->  <built-in function dumps>
UnpicklingError            -->  <class 'cPickle.UnpicklingError'>
PickleError                -->  <class 'cPickle.PickleError'>
HIGHEST_PROTOCOL           -->  2
__name__                   -->  'cPickle'
loads                      -->  <built-in function loads>
Pickler                    -->  <built-in function Pickler>
__doc__                    -->  'C implementation and optimization of the Python pickle module.'
format_version             -->  '2.0'
加载-->
PicklingError-->
__版本-->“1.71”
不可勾选错误-->
转储-->
__内置-->
解钩器-->
兼容的_格式-->['1.0','1.1','1.2','1.3','2.0']
坏消息-->
__包-->无
转储-->
取消勾选错误-->
错误-->
最高\u协议-->2
__名称-->“cPickle”
加载-->
泡菜-->
__文档-->“Python pickle模块的C实现和优化。”
格式化\u版本-->“2.0”


还有一个函数<强>帮助()>强>它带来了你正在搜索的文档。

你可以考虑使用IPython。<代码>第3版>代码>只在Python 2.7中可用。@ Ehan-Furman用Python 2.7在我的答案中执行了代码,而不是在Python 3。x中,因为它可以从打印指令的方式推导出来。代码>\uuuuu dict\uuuuu
至少存在于Python 1.5()@Ethan Furman我犯了一个错误,你说的不是
\uuuuuuu dict\uuuu
,而是
\uuu dir\uuuuu
。你说得对:Python3中有一个描述,Python2中没有。但是我认为这只是关于Python2的一个省略,因为在
dir
的描述中对
\uuu dir\uuu方法的引用是相同的。多亏了你的评论,我意识到
\uuuuu dir\uuuu
不是为某些对象而不是其他对象自动创建的内置方法;它是为用户使用而保留的名称:如果用户使用此名称定义了一个用户定义的方法,则通过调用
dir()
自动调用此方法。我说的是
\uuuuu dir\uuuu
,而不是
\uu dict\uuu
。但是,2.6中似乎添加了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu不检查类属性或对象成员,只运行对象的
.str()
.repr()
方法并格式化它。
import cPickle

for name,obj in  cPickle.__dict__.iteritems() :
    print '%-25s  -->  %r' % (name, obj)
load                       -->  <built-in function load>
PicklingError              -->  <class 'cPickle.PicklingError'>
__version__                -->  '1.71'
UnpickleableError          -->  <class 'cPickle.UnpickleableError'>
dump                       -->  <built-in function dump>
__builtins__               -->  <module '__builtin__' (built-in)>
Unpickler                  -->  <built-in function Unpickler>
compatible_formats         -->  ['1.0', '1.1', '1.2', '1.3', '2.0']
BadPickleGet               -->  <class 'cPickle.BadPickleGet'>
__package__                -->  None
dumps                      -->  <built-in function dumps>
UnpicklingError            -->  <class 'cPickle.UnpicklingError'>
PickleError                -->  <class 'cPickle.PickleError'>
HIGHEST_PROTOCOL           -->  2
__name__                   -->  'cPickle'
loads                      -->  <built-in function loads>
Pickler                    -->  <built-in function Pickler>
__doc__                    -->  'C implementation and optimization of the Python pickle module.'
format_version             -->  '2.0'