Здравствуйте.
С недавних пор увлекся питоном и честно сказать после джавы он выглядит очень странно
С самим с синтаксисом я разобрался, но все что я на нем пишу выглядит как говно.
Хочу понять что я неправильно делаю
Простой пример, пытался написать xml парсер, взял либу lxml и xml'ку следующего вида
<root>
<server>s1</server>
<login>test_login</login>
<password>qwerty</password>
<buildings ai="true">
<building id="" type="" />
<building id="3" type="" />
<building id="5" type="" />
</buildings>
</root>
А вот что у меня получилось на питоне:
from lxml import etree
from common import SimpleEnum
TAG_TYPE = SimpleEnum(('TEXT', 'BUILDING'))
class Buildings:
def __init__(self):
self.ai = None
self.building = []
def __str__(self):
return 'ai: ' + str(self.ai) + '; building: ' + str(self.building)
class Building:
def __init__(self):
self.id = None
def __str__(self):
return 'id: ' + self.id
class Config():
def __init__(self):
self.parse()
def find(self, tag_name, type = TAG_TYPE.TEXT):
tag = self.doc.find(tag_name)
if tag is not None:
if type == TAG_TYPE.TEXT:
text = tag.text
if text:
return text
else:
raise ValueError('Тег: ' + tag_name + 'найден, но не имеет значений')
elif type == TAG_TYPE.BUILDING:
return self.parse_buildings(tag)
else:
raise ValueError('Не найден тег: ' + tag_name)
def parse_buildings(self, tag):
buildings = Buildings()
ai = tag.get('ai')
buildings.ai = False if ai is not None and 'FALSE' == ai.upper() else True
buildings.building = []
for building_tag in tag.findall('building'):
building = Building()
if building_tag.get('id'):
building.id = building_tag.get('id')
buildings.building.append(building)
return buildings
def parse(self):
self.doc = etree.parse('config.xml')
self.server = self.find('server')
self.login = self.find('login')
self.password = self.find('password')
self.buildings = self.find('buildings', TAG_TYPE.BUILDING)
def __str__(self):
return 'server: ' + self.server + '; login: ' + self.login + '; password: ' + self.password + \
'\nbuildings: ' + str(self.buildings)
print(Config())
Не понятно почему не предусмотрена нормальная конвертация str -> bool, bool -> str, что бы если пишешь bool('false') или bool('true') возвращались false и true.
Не понятно почему я могу расширить сущность бина (Buildings и Building) за его пределами. т.е. я бы мог вообще не писать объявление переменных в методах __init__ а просто написать pass и все равно бы все работало.
Не ясно почему нет такой удобной штуки как enum.
Хочется понять что я делаю не так?