Khalil Al Hooti
Khalil Al Hooti

Reputation: 4506

Assign a short name to a class attribute

I am using a Python package which read some type of data. From the data, it creates attributes to easily access meta-information related to the data.

How can create a short name to an attribute?

Basically let's assume the package name is read_data and it has an attribute named data_header_infomation_x_location

import read_data
my_data = read_data(file_path)

How can I instead create a short name to this attribute?

x = "data_header_infomation_x_location"

my_data[1].x gives an error no attribute

Here is a full example from my case

from obspy.io.segy.core import _read_segy

file_path = "some_file_in_my_pc)
sgy = _read_segy(file_path, unpack_trace_headers=True)

sgy[1].stats.segy.trace_header.x_coordinate_of_ensemble_position_of_this_trace

The last line gives a number. e.g., x location

what I want is to rename all this long nested attribute stats.segy.trace_header.x_coordinate_of_ensemble_position_of_this_trace with a short name.

trying for example

attribute = "stats.segy.trace_header.x_coordinate_of_ensemble_position_of_this_trace"

getattr(sgy[1], attribute )

does not work

Upvotes: 0

Views: 171

Answers (1)

Marc
Marc

Reputation: 1629

how about:

from obspy.io.segy.core import _read_segy

attribute_tree_x = ['stats', 'segy', 'trace_header', 'x_coordinate_of_ensemble_position_of_this_trace']

def get_nested_attribute(obj, attribute_tree):
    for attr in attribute_tree:
        obj = getattr(obj, attr)
    return obj

file_path = "some_file_in_my_pc"
sgy = _read_segy(file_path, unpack_trace_headers=True)

sgy[1].stats.segy.trace_header.x_coordinate_of_ensemble_position_of_this_trace
x = get_nested_attribute(sgy[1], attribute_tree_x) # should be the same as the line above

You cannot request the attribute of the attribute in one go, but this loops through the layers to obtain the final value you are looking for.

Upvotes: 1

Related Questions