Недійсна назва константи Pylint


78

Я отримую помилку Pylint щодо моєї константи: MIN_SOIL_PARTICLE_DENS(недійсне ім’я). Будь-які ідеї, чому ця константа неправильна? Ось моя повна функція:

def bulk_density(clay, sand, organic_matter):
    MIN_SOIL_PARTICLE_DENS = 2.65
    x1 = (0.078 + 0.278 * sand + 0.034 * clay + 0.022 * organic_matter - 0.018
          * sand * organic_matter - 0.027 * clay * organic_matter - 0.584 * sand
          * clay)
    x2 = -0.107 + 1.636 * x1
    field_capacity = vol_water_content_33_j_kg(clay, sand, organic_matter)#m3/m3
    sat_water_content = 0.043 + field_capacity + x2 - 0.097 * sand
    return (1 - sat_water_content) * MIN_SOIL_PARTICLE_DENS

Відповіді:


108

Під час перевірки імен Pylint розрізняє константи, змінні, класи тощо. Будь-яке ім'я, яке не знаходиться всередині функції / класу, буде вважатися константою, а все інше - змінною.

Див. Http://docs.pylint.org/features.html#basic-checker

змінна-rgx:
[a-z_][a-z0-9_]{2,30}$

const-rgx:
(([A-Z_][A-Z0-9_]*)|(__.*__))$

Оскільки ви перебуваєте у функції, MIN_SOIL_PARTICLE_DENSце (згідно pylint) має бути змінною, однак pylint трактує її як константу і тому скаржиться.

Це означає, що ви не можете мати будь-яких великих імен всередині функцій без скарги пілінта.


Якщо ви запитаєте мене, використання великих внутрішніх функцій - це нормально; не всі константи обов'язково визначаються глобально.


7
Якщо воно постійне, чому ви хочете перепризначити його значення для кожного виклику цього методу? Це можна визначити поза цим методом.
Максим Шерамі

2
@ Maxime моя ідея полягає в тому, щоб метод був незалежним (не потребуючи зовнішніх констант), хоча це може зайняти буксирування продуктивності через перепризначення констант. Хороший момент, хоча.
gcamargo

@ user2457899 Насправді, я також використовую константи у своїх методах. Я просто намагався висловити ідею цього пілінтового правила. :)
Максим Шерамі

1
Не знаю, думаю, я волів би мати константи поза функціями. Якщо це насправді не була глобальною константою, вона повинна бути змінною.
Рік Хендерсон,

@ MaximeChéramy Чи можете ви висловити думку, чому func_name = make_func(1,2,3)можна вважати помилковим? Поточний випадок використанняvlen = numpy.vectorize(len) модуль utils для роботи з нерівними масивами у h5py .
AnnanFay

1

Кілька простих правил:

  1. Константи слід визначати UPPER_CASEлише буквами і визначати на рівні модуля
  2. Назви класів слід визначати CamelCaseбуквами
  3. Змінні повинні бути визначені lower_caseі повинні бути визначені всередині функції, класів тощо.

Тепер давайте поговоримо про вашу справу,

MIN_SOIL_PARTICLE_DENSвизначається всередині функції і повинен мати лише нижчі літери. Таким чином, замість того, щоб розглядати MIN_SOIL_PARTICLE_DENSяк константу, тут пілінт розглядає її як змінну, а отже, і помилку пілінта.

Підручник з пілінта


0

Мені здавалося, що ця поведінка дратує, але є спосіб налаштувати pylint, щоб уникнути цього!

Об’єднайте наступну декларацію ini-стилю у свій .pylintrcфайл:

[BASIC]
variable-rgx=((([a-z_][a-z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-z][a-z0-9_]+__))$)|([A-Z_][A-Z0-9_]+$)

Я побудував цей регулярний вираз, взявши

і приєднання до них за |деякими дужками.

Теоретично ви можете просто взяти .*, але це дозволить навіть недійсні імена типу mixed_CASE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.