Проверка кода Python для сравнения функции как атрибута - PullRequest
5 голосов
/ 28 марта 2011

Иногда я трачу значительное количество времени на отслеживание мозговых кодов в моем коде ... в то время как я обычно запускаю Pylint против него, некоторые вещи проскальзывают мимо Pylint. Самая простая проблема, которую я могу упустить, это ...

# normally, variable is populated from parsed text, so it's not predictable
variable = 'fOoBaR'
if variable.lower == 'foobar':
    #       ^^^^^<------------------ should be .lower()
    do_something()

Ни pylint, ни Python не лают по этому поводу ... есть ли инструмент проверки кода python, который может пометить эту конкретную проблему?

Ответы [ 3 ]

0 голосов
/ 12 мая 2011

Как вы предлагаете проверку кода для проверки этого?Это совершенно законный синтаксис.Вместо того, чтобы проверять ошибки такого рода, лучше привыкнуть использовать более совершенные шаблоны.

Вместо:

variable = 'fOoBaR'
if variable.lower == 'foobar':
    #       ^^^^^<------------------ should be .lower()
    do_something()

Сделайте следующее:

variable = 'fOoBaR'
sane_variable = variable.lower()
if sane_variable == 'foobar':
    do_something()

Таким образом, вы всегда явно вызываете .lower() для значения, с которым сравниваетесь, вместо того, чтобы полагаться на вызов метода и сравнение на месте, что приводит к той самой ловушке, с которой вы сталкиваетесь.

0 голосов
/ 18 мая 2011
0 голосов
/ 12 мая 2011

@ Майк Пеннингтон Я просто хочу сначала сказать, что я тоже сталкиваюсь с этим. -

@ eyquem 'lower ()' - это функция.'lower' - указатель на функцию (если я не ошибаюсь).Python позволит вам попытаться запустить этот код, но он не будет вызывать функцию.

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

class Foo()
   def func(self):
      #do stuff
      pass

class Bar()
   self.func = "stuff"

Если в вашем коде есть функция, которая принимает аргумент 'baz', например, так:

def myfunction(baz):
    print baz.func

def myfunction(baz):
    baz.func()

Любой из них можетбыть действительным в зависимости от типа базы.Однако буквально нет способа узнать, имеет ли baz тип 'Foo' или 'Bar'.

РЕДАКТИРОВАТЬ: я имел в виду статический анализ ...

...