我看到了一个几乎相同的C#帖子,但找不到与Python相关的任何内容。
因为我刚刚开始学习Python,所以我有一种感觉,我会想到我之前使用的属性,如.count(),并忘记哪些对象具有该属性。
我想编写一个函数,给定目录列表和某个属性,将返回一组具有该属性的对象类。 (理想情况下,我可以搜索在运行此函数时导入的所有类对象,而不仅仅是dir()中的内容
这是我到目前为止所做的:
def whereattr(directory_list, attrib):
haveit = set()
for obj in directory_list:
try:
haveit.add(type(eval(obj)) if hasattr(eval(obj), attrib) else '')
except:
pass
return haveit
我正在使用try / except,因为我发现我无法评估所有对象。
示例:
In [244]: whos
Variable Type Data/Info
-------------------------------------
DataFrame type <class 'pandas.core.frame.DataFrame'>
Series type <class 'pandas.core.series.Series'>
count int 5
counts dict n=97
first_letter function <function <lambda> at 0x1039daf50>
frame DataFrame _heartbeat_ <...>n[3560 rows x 18 columns]
get_counts function <function get_counts at 0x10770ac08>
haveit list n=0
itertools module <module 'itertools' from <...>ib-dynload/itertools.so'>
json module <module 'json' from '/Use<...>on2.7/json/__init__.pyc'>
letter str A
line str { "a": "Mozilla\/4.0 (com<...>.935799, -77.162102 ] }\n
names _grouper <itertools._grouper object at 0x103b51b90>
path str pydata-book/ch02/usagov_b<...>2012-03-16-1331923249.txt
rec dict n=16
records list n=3560
results Series 0 Mozilla/<...>ngth: 3440, dtype: object
test set set([])
testfun function <function testfun at 0x107b2d938>
tz unicode Asia/Seoul
tzs list n=3440
vkp list n=97
whereattr function <function whereattr at 0x107b2d9b0>
x unicode Mozilla/4.0 (compatible; <...>T4.0E; .NET CLR 1.1.4322)
In [247]: whereattr(dir(), "count")
Out[247]: {'', str}
有人请告诉我我做错了什么吗?显然,list,Series等都有一个count属性,应该包括在内。
另外,如果你想骂我代码中的任何其他问题,我可以接受(好的)批评。
答案 0 :(得分:2)
dir
在这里有点无用,我宁愿推荐locals
或globals
,因为它会为您提供参考,因此您不需要使用eval。
[label for label, ref in locals().items() if hasattr(ref, 'count')]
显然你可以把它放到像
这样的函数中whereattr = lambda scope, attr: [label for label, ref in scope.items() if hasattr(ref, attr)]
你就像这样使用它
whereattr(locals(), 'count')
或
whereattr(vars(__builtin__), 'count')
答案 1 :(得分:0)
您不应该使用eval()
来查找对象。尝试这样的事情:
def whereattr(directory_list, attrib):
haveit = set()
scope = globals()
for obj_name in directory_list:
if obj_name in scope:
obj = scope[obj_name]
if hasattr(obj, attrib):
haveit.add(type(obj))
return haveit
这将找到具有给定属性的全局范围内的所有对象。
修改:尽管使用eval()
是不好的做法,但原始代码应该有效。所以我实际上不确定底层问题是什么。 (参见我对原始问题的评论。)
答案 2 :(得分:0)
您应该将您的except子句更改为except Exception, e: print str(e)
。它告诉你你做错了什么。如果你丢失eval
,它似乎有效。
def whereattr(directory_list, attrib):
haveit = set()
for obj in directory_list:
try:
haveit.add(type(obj) if hasattr(obj, attrib) else '')
except Exception, e:
print str(e)
return haveit
>>> whereattr([list], "count")
set([<type 'type'>])
>>>