vedar vedar - 5 months ago 25
Python Question

Call a method on getattr() function

I use

python-metar
to decode METAR data. Object returned after parsing METAR strings looks like this:

>>> dir(decoded)[-5:]
['wind_shift', 'wind_shift_time', 'wind_speed', 'wind_speed_peak', 'windshear']


These attributes, have additional methods -
value()
,
unit()
, and
string()
.
I used the
getattr()
builtin function to loop over all of them:

>>> attributes = [..., 'wind_speed', 'wind_speed_peak', 'windshear']
>>> for attr in attributes:
>>> print(getattr(decoded, attr))


But this way I get the default string representation, and that is a string with a value and its unit, like
10 knots
, while I'd like to get just the numerical value, which I can reach through
value()
method:

>>> decoded.wind_speed.value()
10.0


So I can't figure how to use
getattr()
and at the same time to call a method (in this case
value()
method).

Answer

With your code, getattr will return till decoded.wind_speed. If you want to call value function of decoded.wind_speed you have to call value() with the object return by getattr.

print(getattr(decoded, attr).value())

OR

You can use another getattr to call value method.

print(getattr(getattr(decoded, attr)), "value")()