[Tutor] Where am I mistaken? (exec not working as I expect)
Francesco Loffredo
fal at libero.it
Sun Mar 12 18:48:35 EDT 2017
Hello everybody!
I'm stuck in the effort to access some data fields in a LibreOffice
Base form from a Python macro.
I did only find a way to access the current document, but that's
all. Armed with that, and hoping to find some field names, I wrote a
small routine to inspect the types of all elements in that document,
and I stumbled in a strange behaviour in the exec() function: it seems
that exec() only works if called from the interactive interpreter,
while it doesn't if called inside a program.
Why?
(by the way, if somebody knows how to read currently displayed data
from fields in a LibreOffice Base form and put it in some other field
on the same form, using a Python macro, I would be very happy...)
Francesco
Here's my code: (Python 3.5.3 on Linux)
import inspect, collections
def esplora(xModel):
i = 0
questi = []
for x in dir(xModel):
qqq = "Non Modif"
what = "Nothing"
try:
what = "Attr?"
exec("qqq = inspect.getmembers(xModel.%s)" % x)
what = "Attr!!!"
if qqq == "Non Modif":
try:
what = "Type?"
exec("qqq = type(xModel.%s)" % x)
what = "Type!!!"
except:
what = "Except2"
except:
what = "Except1"
questi.append(str((x, qqq, what)))
i += 1
questi.append(("Totale elementi: %s" % i, ))
print("\n".join(questi))
Example data:
>>> class prova(object):
... def __init__(self):
... self.abc = "ABC"
... self.num = 123
... self.tup = ("abc", 321)
...
>>> lui = prova()
Applied the function to the sample data: incorrect behaviour
>>> esplora(lui)
('__class__', 'Non Modif', 'Type!!!')
('__delattr__', 'Non Modif', 'Type!!!')
('__dict__', 'Non Modif', 'Type!!!')
('__dir__', 'Non Modif', 'Type!!!')
('__doc__', 'Non Modif', 'Type!!!')
('__eq__', 'Non Modif', 'Type!!!')
('__format__', 'Non Modif', 'Type!!!')
('__ge__', 'Non Modif', 'Type!!!')
('__getattribute__', 'Non Modif', 'Type!!!')
('__gt__', 'Non Modif', 'Type!!!')
('__hash__', 'Non Modif', 'Type!!!')
('__init__', 'Non Modif', 'Type!!!')
('__le__', 'Non Modif', 'Type!!!')
('__lt__', 'Non Modif', 'Type!!!')
('__module__', 'Non Modif', 'Type!!!')
('__ne__', 'Non Modif', 'Type!!!')
('__new__', 'Non Modif', 'Type!!!')
('__reduce__', 'Non Modif', 'Type!!!')
('__reduce_ex__', 'Non Modif', 'Type!!!')
('__repr__', 'Non Modif', 'Type!!!')
('__setattr__', 'Non Modif', 'Type!!!')
('__sizeof__', 'Non Modif', 'Type!!!')
('__str__', 'Non Modif', 'Type!!!')
('__subclasshook__', 'Non Modif', 'Type!!!')
('__weakref__', 'Non Modif', 'Type!!!')
('abc', 'Non Modif', 'Type!!!')
('num', 'Non Modif', 'Type!!!')
('tup', 'Non Modif', 'Type!!!')
Totale elementi: 28
>>> type(lui.tup)
<class 'tuple'>
>>> dir(lui)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'abc',
'num', 'tup']
>>>
Same thing called directly: correct behaviour
>>> for x in dir(lui):
... exec("y = type(lui.%s)" % x)
... print((x, y))
...
('__class__', <class 'type'>)
('__delattr__', <class 'method-wrapper'>)
('__dict__', <class 'dict'>)
('__dir__', <class 'builtin_function_or_method'>)
('__doc__', <class 'NoneType'>)
('__eq__', <class 'method-wrapper'>)
('__format__', <class 'builtin_function_or_method'>)
('__ge__', <class 'method-wrapper'>)
('__getattribute__', <class 'method-wrapper'>)
('__gt__', <class 'method-wrapper'>)
('__hash__', <class 'method-wrapper'>)
('__init__', <class 'method'>)
('__le__', <class 'method-wrapper'>)
('__lt__', <class 'method-wrapper'>)
('__module__', <class 'str'>)
('__ne__', <class 'method-wrapper'>)
('__new__', <class 'builtin_function_or_method'>)
('__reduce__', <class 'builtin_function_or_method'>)
('__reduce_ex__', <class 'builtin_function_or_method'>)
('__repr__', <class 'method-wrapper'>)
('__setattr__', <class 'method-wrapper'>)
('__sizeof__', <class 'builtin_function_or_method'>)
('__str__', <class 'method-wrapper'>)
('__subclasshook__', <class 'builtin_function_or_method'>)
('__weakref__', <class 'NoneType'>)
('abc', <class 'str'>)
('num', <class 'int'>)
('tup', <class 'tuple'>)
>>>
More information about the Tutor
mailing list