сократить/привести в нормальный вид код Python
Если в кратце, то код выполняет прасинг сайта с персонажами Звездных войн,реализуемая при помощи библиотеки requests
При вводе id показывая его: id, имя, вес, рост
Ну так вот, как можно сократить код, чтобы он стал более опрятным и красивым
import requests
import operator
class Base_Person:
def __init__(self, uid, name):
self.__id = uid
self.__name = name
def __repr__(self):
return 'Person(id: {a}, name: {b})'.format(b=self.__name, a=self.__id)
class Person(BasePerson):
def __init__(self, uid, name, height, mass):
super().__init__(uid, name)
self.__id = uid
self.__name = name
self.__height = height
self.__weight = mass
def __repr__(self):
return 'Person(id: {a}; name: {b}; height: {c}; mass: {d})'.format(b=self.__name, a=self.__id, c=self.__height, d=self.__weight).replace(',', '')
class Star_Wars_API:
def get_person(id):
result = requests.get('https://www.swapi.tech/api/people/{}'.format(id)).json()
return Person(id, result['result']['properties']['name'], result['result']['properties']['height'],
result['result']['properties']['mass'])
def get_all(get_full=False):
results = requests.get('https://www.swapi.tech/api/people?page=2&limit=82').json()
if get_full:
for idx in results['results']:
name = requests.get(idx['url']).json()['result']['properties']['name']
mass = requests.get(idx['url']).json()['result']['properties']['mass']
height = requests.get(idx['url']).json()['result']['properties']['height']
yield Person(idx['uid'], name, height, mass)
else:
for idx in results['results']:
yield BasePerson(idx['uid'], idx['name'])
print(StarWarsAPI.get_person(5))
persons = StarWarsAPI.get_all(get_full=True)
i = 0
person_h = {}
for p in persons:
if i == 20:
break
if p.__repr__().split(sep=';')[2].split()[1].isdigit():
height = int(p.__repr__().split(sep=';')[2].split()[1])
person_h[p.__repr__().split(sep=';')[1].split()[1]] = height
i += 1
print('The highest is ', sorted(person_h.items(), key=operator.itemgetter(1))[-1][0])
``
Ответы (2 шт):
Автор решения: Эникейщик
→ Ссылка
Как минимум вот такие вещи
p.__repr__().split(sep=';')[2].split()[1].isdigit()
делать не нужно. Тут вообще непонятно что проверяется. __repr__ делается совсем не для того, чтобы его потом парсить.
Если нужно какое-то свойство объекта, то нужно использовать геттер или просто обратиться к свойству напрямую (типа p.get_name() или p.name).
Автор решения: eri
→ Ссылка
import requests
import operator
class Base_Person:
def __init__(self, uid, name):
self.id = uid
self.name = name
def __repr__(self):
return f'Person(id: {self.id}, name: {self.name})'
class Person(BasePerson):
def __init__(self, uid, name, height, mass):
super().__init__(uid, name)
self.height = height
self.weight = mass
def __repr__(self):
return f'Person(id: {self.id}; name: {self.name}; height: {self.height}; mass: {self.weight})'.replace(',', '')
class Star_Wars_API:
def get_person(id):
result = requests.get('https://www.swapi.tech/api/people/{}'.format(id)).json()
return Person(id, result['result']['properties']['name'],
result['result']['properties']['height'],
result['result']['properties']['mass'])
def get_all(get_full=False):
results = requests.get('https://www.swapi.tech/api/people?page=2&limit=82').json()
if get_full:
for idx in results['results']:
name = requests.get(idx['url']).json()['result']['properties']['name']
mass = requests.get(idx['url']).json()['result']['properties']['mass']
height = requests.get(idx['url']).json()['result']['properties']['height']
yield Person(idx['uid'], name, height, mass)
else:
for idx in results['results']:
yield BasePerson(idx['uid'], idx['name'])
print(StarWarsAPI.get_person(5))
persons = StarWarsAPI.get_all(get_full=True)
print('The highest is ', sorted(persons, key=operator.attrgetter('height'))[-1].name)