сократить/привести в нормальный вид код 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)
→ Ссылка