This is a re-share. I was looking for something today and come across this. It's just some code to get all unique attrs across all ui elements. Just updated with a nice addition from @ccc. It looks long and bulky. But it's just all the comments and trying to show it easily in my opinion. Below that, I do the same share without comments and condensing the functions. Just to show about sharing. Normally when I share, I don't try to condense everything. I go more for the understanding side of things. Not sure what's better.
# Phuket2 , Pythonista Forums (Python profiency, not much)
# date - 7 oct 2016
# works for python 2 or 3
'''
get_all_attrs_set - the main function of interest
iterates over a list of all the ui Elements, and retuns a set of
all the unique attrs for all the ui Elements combined.
i am sure this could be tighten up more. But i think the readabilty
is ok now. if not for ui.NavigationView, i would have tried to use
a list comp rather than the for. I could have tried to special case
it, but i think personally this is more clear given what it is.
'''
import ui, pprint, inspect
'''
# 7 oct 2016
This was hard coded before. Have commented it out now. i have left
it in just to show the lesson i learnt. only recently also :(
@ccc provided the list comp in the func get_ui_classes() that
totally negates having to create a static list.
_ui_controls = \
[
ui.View, ui.Button, ui.ButtonItem, ui.ImageView, ui.Label,
ui.NavigationView, ui.ScrollView, ui.SegmentedControl,
ui.Slider, ui.Switch, ui.TableView, ui.TextField, ui.TextView,
ui.WebView, ui.DatePicker, ui.ActivityIndicator, ui.TableViewCell
]
'''
def get_ui_classes():
# thanks @ccc
return [c for _, c in inspect.getmembers(ui) if hasattr(c, 'superview')]
_ui_controls = get_ui_classes()
def get_full_dict(obj):
# get all the dict attrs for obj, no filter
return {k: getattr(obj, k) for k in dir(obj)}
def get_all_attrs_set():
# return a set of unique attrs across all ui_elements
# sets doing all the hard work with the union operator '|'
s = set()
for ctl in _ui_controls:
try:
s = s | set(get_full_dict(ctl()))
except:
# handle differently for ui.NavigationView, it needs a
# ui.View as a param
if ctl is ui.NavigationView:
s = s | set(get_full_dict(ctl(ui.View())))
else:
# print out a control type if an error produced we
# do not handle
print(ctl)
return s
if __name__ == '__main__':
# pprint prints out a nice easy to view, sorted list of the attrs
pp = pprint.PrettyPrinter(indent=4, width=80)
attr_set = get_all_attrs_set()
pp.pprint(attr_set)
print('Number of unique attrs across all ui elements (not filtered) - {}'.format(len(attr_set)))
print()
print('python 3.5x reports 155 items, python 2.7x reports 149 items. the difference lays in the attrs starting with _')
The same result, just condensed and comments removed.
```python
import ui, pprint, inspect
def get_all_attrs_set():
s = set()
for ctl in [c for _, c in inspect.getmembers(ui) if hasattr(c, 'superview')]:
try:
s = s | set({k: getattr(ctl, k) for k in dir(ctl)})
except:
if ctl is ui.NavigationView:
s = s | set({k: getattr(ctl, k) for k in dir(ctl(ui.View()))})
else:
print(ctl)
return s
if name == 'main':
# pprint prints out a nice easy to view, sorted list of the attrs
pp = pprint.PrettyPrinter(indent=4, width=80)
attr_set = get_all_attrs_set()
pp.pprint(attr_set)
print('Number of unique attrs across all ui elements (not filtered) - {}'.format(len(attr_set)))
print()
print('python 3.5x reports 155 items, python 2.7x reports 149 items. the difference lays in the attrs starting with _')
```python