Hateman31
@Hateman31
Делиться мыслями - это круто!

Как переписать класс?

class Vehicle(API):
	def vehicle_stats(self, lang='ru', fields='', account_id=''):
		endpoint = '/tanks/stats/'
		if type(fields) is list:
			fields = self._format_fields(fields)	
		return self._api_call(endpoint=endpoint, fields=fields, language=lang, account_id=account_id)
 
	def vehicle_achievements(self, lang='ru', fields='', account_id=''):
		endpoint = '/tanks/achievements/'
		if type(fields) is list:
			fields = self._format_fields(fields)	
		return self._api_call(endpoint=endpoint, fields=fields, language=lang, account_id=account_id)

попался такой код в одном из проектов на github.
Это собственно весь модуль. Данный класс дает доступ к статистике танка игрока в wot.
Очевидно же, что код избыточен и можно его уменьшить.
Как переписать класс, чтобы один и тот же метод вызвать с разным параметром endpoint?
  • Вопрос задан
  • 325 просмотров
Решения вопроса 1
Tark
@Tark
Pyramid'альный мир
Если нужно именно убрать избыточность и при условии, что код будет вызываться только вашим приложением, то можно его изменить таким образом.

class Vehicle(API):
    def get(self, endpoint='/tanks/stats/', lang='ru', fields='', account_id=''):
        if type(fields) is list:
            fields = self._format_fields(fields)	
        return self._api_call(endpoint=endpoint, 
                              fields=fields, 
                              language=lang, 
                              account_id=account_id)

vehicle = Vehicle(...)

stats = vehicle.get()
achievements = vehicle.get('/tanks/achievements/')


Если же этот код вызывается кем-то ещё, то сами понимаете...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@SlivTime
Я бы сделал так. Переменную endpoint, конечно, можно не инициализировать, а сразу передавать строку в вызов _call_with_endpoint. Но так нагляднее.

class Vehicle(API):
    def _call_with_endpoint(self, lang, fields, account_id, endpoint):
        if type(fields) is list:
          fields = self._format_fields(fields)  
        return self._api_call(endpoint=endpoint,
                              fields=fields,
                              language=lang,
                              account_id=account_id)

    def vehicle_stats(self, lang='ru', fields='', account_id=''):
        endpoint = '/tanks/stats/'
        return self._call_with_endpoint(lang=lang,
                                        field=fields,
                                        account_id=account_id,
                                        endpoint=endpoint)
        

    def vehicle_achievements(self, lang='ru', fields='', account_id=''):
        endpoint = '/tanks/achievements/'
        return self._call_with_endpoint(lang=lang,
                                        field=fields,
                                        account_id=account_id,
                                        endpoint=endpoint)
Ответ написан
Комментировать
@Mintormo
class Vehicle(API):
    def vehicle_stats(self, lang='ru', fields='', account_id='', endpoint = '/tanks/stats/'):  
        if type(fields) is list:
            fields = self._format_fields(fields)	
        return self._api_call(endpoint=endpoint, fields=fields, language=lang, account_id=account_id)

    def vehicle_achievements(self, lang='ru', fields='', account_id='', endpoint = '/tanks/achievements/'):    
        if type(fields) is list:
            fields = self._format_fields(fields)	
        return self._api_call(endpoint=endpoint, fields=fields, language=lang, account_id=account_id


Как-то так. Если надо оставить все по-умолчанию, то просто не пишите последний параметр. Если надо изменить endpoint, то пишите в конце endpoint = "то_что_надо".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы