Creating different classes dynamically?

V

Victor Hooi

Hi,

I have a directory tree with various XML configuration files.

I then have separate classes for each type, which all inherit from a base. E.g.

class AnimalConfigurationParser:
...

class DogConfigurationParser(AnimalConfigurationParser):
...

class CatConfigurationParser(AnimalConfigurationParser):
....

I can identify the type of configuration file from the root XML tag.

I'd like to walk through the directory tree, and create different objects based on the type of configuration file:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
with open(os.path.join(root, file), 'r') as f:
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
# Do something to create the appropriate type of parser
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

I have a dict with the root tags - I was thinking of mapping these directly to the functions - however, I'm not sure if that's the right way to do it? Is there a more Pythonic way of doing this?

root_tags = {
'DogRootTag': DogConfigurationParser(),
'CatRootTag': CatConfigurationParser(),
}

Cheers,
Victor
 
D

Dave Angel

Hi,

I have a directory tree with various XML configuration files.

I then have separate classes for each type, which all inherit from a base. E.g.

class AnimalConfigurationParser:
...

class DogConfigurationParser(AnimalConfigurationParser):
...

class CatConfigurationParser(AnimalConfigurationParser):
....

I can identify the type of configuration file from the root XML tag.

I'd like to walk through the directory tree, and create different objects based on the type of configuration file:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
with open(os.path.join(root, file), 'r') as f:
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
# Do something to create the appropriate type of parser
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

I have a dict with the root tags - I was thinking of mapping these directly to the functions - however, I'm not sure if that's the right way to do it? Is there a more Pythonic way of doing this?

root_tags = {
'DogRootTag': DogConfigurationParser(),
'CatRootTag': CatConfigurationParser(),
}

Cheers,
Victor

Your subject line says you want to create the classes dynamically, but
that's not what your code implies. if you just want to decide which
class to INSTANTIATE dynamically, that's easily done, and you have it
almost right. In your dict you should leave off those parentheses.



Then the parser creation looks something like:
parser_instance = root_tags[root.tag] (arg1, arg2)

where the arg1, arg2 are whatever arguments the __init__ of these
classes expects.

(untested)
 
V

Victor Hooi

heya,

Dave: Ahah, thanks =).

You're right, my terminology was off, I want to dynamically *instantiate*, not create new classes.

And yes, removing the brackets worked =).

Cheers,
Victor

Hi,

I have a directory tree with various XML configuration files.

I then have separate classes for each type, which all inherit from a base. E.g.

class AnimalConfigurationParser:


class DogConfigurationParser(AnimalConfigurationParser):


class CatConfigurationParser(AnimalConfigurationParser):


I can identify the type of configuration file from the root XML tag.

I'd like to walk through the directory tree, and create different objects based on the type of configuration file:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
with open(os.path.join(root, file), 'r') as f:

tree = etree.parse(f)
root = tree.getroot()


# Do something to create the appropriate type of parser
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

I have a dict with the root tags - I was thinking of mapping these directly to the functions - however, I'm not sure if that's the right way to do it? Is there a more Pythonic way of doing this?

root_tags = {
'DogRootTag': DogConfigurationParser(),
'CatRootTag': CatConfigurationParser(),



Victor



Your subject line says you want to create the classes dynamically, but

that's not what your code implies. if you just want to decide which

class to INSTANTIATE dynamically, that's easily done, and you have it

almost right. In your dict you should leave off those parentheses.







Then the parser creation looks something like:

parser_instance = root_tags[root.tag] (arg1, arg2)



where the arg1, arg2 are whatever arguments the __init__ of these

classes expects.



(untested)



--



DaveA
 
V

Victor Hooi

heya,

Dave: Ahah, thanks =).

You're right, my terminology was off, I want to dynamically *instantiate*, not create new classes.

And yes, removing the brackets worked =).

Cheers,
Victor

Hi,

I have a directory tree with various XML configuration files.

I then have separate classes for each type, which all inherit from a base. E.g.

class AnimalConfigurationParser:


class DogConfigurationParser(AnimalConfigurationParser):


class CatConfigurationParser(AnimalConfigurationParser):


I can identify the type of configuration file from the root XML tag.

I'd like to walk through the directory tree, and create different objects based on the type of configuration file:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
with open(os.path.join(root, file), 'r') as f:

tree = etree.parse(f)
root = tree.getroot()


# Do something to create the appropriate type of parser
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

I have a dict with the root tags - I was thinking of mapping these directly to the functions - however, I'm not sure if that's the right way to do it? Is there a more Pythonic way of doing this?

root_tags = {
'DogRootTag': DogConfigurationParser(),
'CatRootTag': CatConfigurationParser(),



Victor



Your subject line says you want to create the classes dynamically, but

that's not what your code implies. if you just want to decide which

class to INSTANTIATE dynamically, that's easily done, and you have it

almost right. In your dict you should leave off those parentheses.







Then the parser creation looks something like:

parser_instance = root_tags[root.tag] (arg1, arg2)



where the arg1, arg2 are whatever arguments the __init__ of these

classes expects.



(untested)



--



DaveA
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top