Рубрики
Без рубрики

Python: пример плохой обезьяны

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Сегодня один из моих коллег пришел и получил меня так, чтобы я мог объяснить какой-то странный код Python, который они нашли. Он имел дело с Cmake, но так как он был внутренним кодом, я не смогу показать это здесь. Вместо этого я написал что-то, что имеет те же проблемы, чтобы вы могли видеть, что я считаю плохой, или по крайней мере, очень тупой код:

class Config:
    
    def Run(self):
        print('Program Usage: blah blah blah')
        
        print(self.product)
        
        self.asset_tag = 'test'
        print(self.asset_tag)
        
        total = self.sub_total_a + self.sub_total_b

Когда я впервые увидел это, я был поражен тем, как он использовал атрибуты, которые не были инициализированы, и я задавался вопросом, как это могло работать. Тогда я понял, что они должны делать какую-то паттер обезьяны. Патчевка обезьян – это то, где вы пишете код для динамического изменения класса или модуля во время выполнения. Поэтому я посмотрел на скрипте и нашел какой-то код, который создал экземпляр класса и сделал что-то подобное:

def test_config():
    cfg = Config()
    cfg.product = 'laptop'
    cfg.asset_tag = '12345ABCD'
    cfg.sub_total_a = 10.23
    cfg.sub_total_b = 112.63
    cfg.Run()
    
if __name__ == '__main__':
    test_config()

Таким образом, всякий раз, когда вы создаете экземпляр класса, вам нужно исправить его, чтобы атрибуты были до того, как вы позвоните Беги метод.

Хотя я думаю, что это довольно круто, что Python может сделать такую вещь, это чрезвычайно запутанному кому-то, кто не знаком с Python, особенно когда код был таким же плохо документирован, как это было. Как видите, комментариев нет или доклады нет, поэтому потребовалось немного копаться, чтобы выяснить, что происходит. К счастью, весь код был в том же файле. В противном случае это могло быть очень сложно выяснить.

Я лично подумал, что это хороший пример плохого кодирования. Если бы я написал это, я бы создал бы __init__ Способ и инициализированные все эти атрибуты там. Тогда не было бы путаницы о том, как работал класс. Я также большой верующий в написании хороших Docstrings и полезных комментариев.

Во всяком случае, я надеюсь, что вы нашли это интересно. Я также думал, что мои читатели должны знать о некоторых из кусочков кадчей кода, которые вы увидите в дикой природе.