Имеет ли python строгое использование; и используйте предупреждения; как в perl?

Я изучаю Perl и Python ... в то же время, не по моей задумке, но это необходимо.

Вопрос:

В сценарии perl я использую (см. Ниже) в начале своего txt.

#!/usr/bin/env perl

use strict;
use warnings;

Есть ли что-то, что я должен делать в обычном порядке для моих скриптов Python?


person jon_shep    schedule 16.11.2012    source источник
comment
Как упоминалось в ответе Lattyware, они существуют в perl, потому что по умолчанию он ведет себя плохо (что полезно только для однострочных).   -  person jordanm    schedule 17.11.2012
comment
@jordanm Я бы не сказал, что по умолчанию это плохое поведение. :) Эти модули предназначены для отлова ошибок, которые можно не заметить.   -  person squiguy    schedule 17.11.2012
comment
@squiguy Я назвал это плохим поведением, потому что я не могу представить себе случай вне однострочника, где вы бы этого не захотели. Просто ознакомьтесь с некоторыми из ответов perl здесь, это широко признано как то, что необходимо добавить. Даже Moose импортирует и то, и другое на простом use Moose   -  person jordanm    schedule 17.11.2012
comment
@jordanm Справедливо, не использовать их считается плохим. У вас есть веская точка зрения.   -  person squiguy    schedule 17.11.2012
comment
Дело не столько в том, чтобы быть бедным, а в том, чтобы быть оптимизированным для общего случая - Python делает это действительно хорошо. По умолчанию обычно используется то, что вы хотите в 90% случаев.   -  person Gareth Latty    schedule 17.11.2012
comment
По этому поводу у меня есть еще один вопрос. Если python по умолчанию использует эти меры предосторожности, не могли бы вы их отключить? Или, что более интересно, почему бы вам не включить их в Perl?   -  person jon_shep    schedule 17.11.2012
comment
@jordanm, Python также по умолчанию использует плохое поведение, но без возможности выбора альтернативного хорошего поведения в некоторых случаях. В частности, use strict "vars" - это то, чего я больше всего скучаю при программировании на Python, это один из основных источников ошибок в моих программах.   -  person salva    schedule 17.11.2012
comment
Я рекомендую использовать среду IDE с анализом кода, такую ​​как aptana studio 3 или pylint, которая выделяет распространенные ошибки перед запуском своей программы.   -  person monkut    schedule 25.09.2013
comment
Частный случай, когда я хотел бы, чтобы python предупреждал о сомнительном коде: seek- предупреждение-Python для функции-умножения   -  person Krazy Glew    schedule 21.05.2016


Ответы (6)


Чтобы дать ответ, который, возможно, позволит избежать шума здесь, я попробую другой.

Две прагматы в вашем исходном вопросе действительно расширяются до:

use strict "vars";
use strict "refs";
use strict "subs";
use warnings;

Чтобы ответить каждому по очереди:

  • Эффект use strict "vars" заключается в том, что ошибка времени компиляции ссылается на переменную без предварительного объявления о ее существовании (например, по умолчанию в более статических языках, таких как C, C ++ и Java). Поскольку в Python нет специального синтаксиса для объявления о существовании переменной, у него нет эквивалента. Присвоение имени в Python всегда создает его, если оно сначала не существовало. Эта функция strict не имеет эквивалента Python, и безопасность, которую она обеспечивает, не может быть воссоздана.

Eg:

$ perl -c -e 'use strict "vars"; $foo = 1'
Global symbol "$foo" requires explicit package name at -e line 1.
-e had compilation errors.

$ perl -c -e 'no strict "vars"; $foo = 1'
-e syntax OK
  • Эффект use strict "refs" состоит в том, чтобы запретить использование простых строк, содержащих имя (существующей или новой) переменной, в качестве ссылки на саму переменную. Python этого не делает, поэтому отключать его не нужно.

Eg:

$ perl -e 'use strict "refs"; ${"message"} = "hello"; print $message'
Can't use string ("message") as a SCALAR ref while "strict refs" in use at -e line 1.

$ perl -e 'no strict "refs"; ${"message"} = "hello"; print $message'
hello
  • Эффект use strict "subs" состоит в том, чтобы вызвать во время компиляции любую попытку вызвать функцию, о существовании которой известно, что она не существует. Python не выполняет такую ​​проверку и не имеет возможности включить такую ​​функцию.

Eg:

$ perl -c -e 'use strict "subs"; foo'
Bareword "foo" not allowed while "strict subs" in use at -e line 1.
-e had compilation errors.

$ perl -c -e 'no strict "subs"; foo'
-e syntax OK
  • Эффект use warnings состоит в том, чтобы включить больше предупреждений как во время компиляции, так и во время выполнения различных категорий поведения, которые были по умолчанию в более ранних версиях, иногда могут быть желательными или которые никогда не были хорошей идеей, но не являются строго ошибкой. Например, использование неинициализированных значений в качестве чисел обычно должно вызывать предупреждение, но изначально этого не было.

Eg:

$ perl -e 'use warnings; my $u; print 2 + $u'
Use of uninitialized value $u in addition (+) at -e line 1.
2

$ perl -e 'no warnings; my $u; print 2 + $u'
2

Ну наконец то; были сделаны некоторые комментарии о том, что Python имеет аналогичные функции в __future__. Однако это не следует рассматривать как аналог прагматов Perl, поскольку большинство последних имеют лексическую область видимости и могут быть включены или отключены в небольших пределах по мере необходимости; где __future__ Python включен только для всего исходного файла.

Eg.

use strict;
use warnings;

my $total;

$total += count_things($_) for @list;

{
   no warnings 'uninitialized';
   printf "The total is %d\n", $total;
}

Несколько надуманный пример, но этот демонстрирует использование no warnings 'uninitialized' для отключения предупреждения об использовании неинициализированного значения просто внутри оператора printf, при этом остальные предупреждения остаются включенными везде.


Итак, в итоге: Python не имеет use strict или какого-либо почти эквивалента, поскольку любые из функций безопасности, которые он предоставляет, являются обязательными или недоступными на языке Python и не имеют use warnings. Те функции, которые он предоставляет, включены только на уровне файлов и не могут быть выборочно включены или отключены для каждой области.


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

person LeoNerd    schedule 20.11.2012
comment
Очень информативно, немного надумано, но я предпочитаю учиться именно так. Не могли бы вы связать или расширить свой раздел редактирования? Просто любопытно по поводу включения и отключения синтаксиса. - person jon_shep; 20.11.2012

Как писали другие пользователи, у Python нет строгой прагмы. И это, на мой взгляд, один из самых больших его недостатков. Более того, это одна из причин того, что для серьезных программных проектов я все еще использую Perl.

Без сомнения, найдутся приверженцы Python, которые обидятся на это заявление. Я слышал, что некоторые говорят, что им не нужны строгие правила. Я считаю, что те, кто так говорит, обычно не знают, что вам нравится в строгости. Рассмотрим следующий блок кода на Python:

def Main():
    print(GetPrice(100,"Alaska"))
    print(GetPrice(100,"Florida"))
    print(GetPrice(100,"Michigan"))
    print(GetPrice(100,"Wisconsin"))

def GetPrice(UnitPrice,State):
    StateSalesTaxRate = 0
    if State == "Alabama": StateSalesTaxRate = 0.04
    if State == "Alaska": StateSalesTaxRate = 0
    if State == "Arizona": StateSalesTaxRate = 0.056
    if State == "Arkansas": StateSalesTaxRate = 0.065
    if State == "California": StateSalesTaxRate = 0.075
    if State == "Colorado": StateSalesTaxRate = 0.029
    if State == "Connecticut": StateSalesTaxRate = 0.0635
    if State == "Delaware": StateSalesTaxRate = 0
    if State == "Florida": StateSalesTaxRate = 0.06
    if State == "Georgia": StateSalesTaxRate = 0.04
    if State == "Guam": StateSalesTaxRate = 0.04
    if State == "Hawaii": StateSalesTaxRate = 0.04
    if State == "Idaho": StateSalesTaxRate = 0.06
    if State == "Illinois": StateSalesTaxRate = 0.0625
    if State == "Indiana": StateSalesTaxRate = 0.07
    if State == "Iowa": StateSalesTaxRate = 0.06
    if State == "Kansas": StateSalesTaxRate = 0.0615
    if State == "Kentucky": StateSalesTaxRate = 0.06
    if State == "Louisiana": StateSalesTaxRate = 0.04
    if State == "Maine": StateSalesTaxRate = 0.055
    if State == "Maryland": StateSalesTaxRate = 0.06
    if State == "Massachusetts": StateSalesTaxRate = 0.0625
    if State == "Michigan": StateSalesTexRate = 0.06
    if State == "Minnesota": StateSalesTaxRate = 0.06875
    if State == "Mississippi": StateSalesTaxRate = 0.07
    if State == "Missouri": StateSalesTaxRate = 0.04225
    if State == "Montana": StateSalesTaxRate = 0
    if State == "Nebraska": StateSalesTaxRate = 0.055
    if State == "Nevada": StateSalesTaxRate = 0.0685
    if State == "New Hampshire": StateSalesTaxRate = 0
    if State == "New Jersey": StateSalesTaxRate = 0.07
    if State == "New Mexico": StateSalesTaxRate = 0.05125
    if State == "New York": StateSalesTaxRate = 0.04
    if State == "North Carolina": StateSalesTaxRate = 0.0475
    if State == "North Dakota": StateSalesTaxRate = 0.05
    if State == "Ohio": StateSalesTaxRate = 0.0575
    if State == "Oklahoma": StateSalesTaxRate = 0.045
    if State == "Oregon": StateSalesTaxRate = 0
    if State == "Pennsylvania": StateSalesTaxRate = 0.06
    if State == "Puerto Rico": StateSalesTaxRate = 0.105
    if State == "Rhode Island": StateSalesTaxRate = 0.07
    if State == "South Carolina": StateSalesTaxRate = 0.06
    if State == "South Dakota": StateSalesTaxRate = 0.04
    if State == "Tennessee": StateSalesTaxRate = 0.07
    if State == "Texas": StateSalesTaxRate = 0.0625
    if State == "Utah": StateSalesTaxRate = 0.0595
    if State == "Vermont": StateSalesTaxRate = 0.06
    if State == "Virginia": StateSalesTaxRate = 0.053
    if State == "Washington": StateSalesTaxRate = 0.065
    if State == "West Virginia": StateSalesTaxRate = 0.06
    if State == "Wisconsin": StateSalesTaxRate = 0.05
    if State == "Wyoming": StateSalesTaxRate = 0.04
    return(UnitPrice*(1+StateSalesTaxRate))

if __name__ == '__main__': Main()

Этот код вычисляет стоимость покупок, включая налог с продаж. Конечно, есть более эффективные способы сделать это, но это только иллюстрация.

Итак, вы видите что-то не так с кодом? Нет? Попробуйте запустить его. Когда вы получите:

100
106.0
100
105.0

Все еще не видите проблемы? Тогда у вас проблема посерьезнее, чем вы думаете. Вот эквивалентный код, отрисованный на Perl:

use strict;

sub Main
{
    print GetPrice(100,"Alaska"), "\n";
    print GetPrice(100,"Florida"), "\n";
    print GetPrice(100,"Michigan"), "\n";
    print GetPrice(100,"Wisconsin"), "\n";    
}

sub GetPrice
{
    my($UnitPrice,$State) = @_;
    my $StateSalesTaxRate = 0;
    $StateSalesTaxRate = 0.04 if $State eq "Alabama";
    $StateSalesTaxRate = 0 if $State eq "Alaska";
    $StateSalesTaxRate = 0.056 if $State eq "Arizona";
    $StateSalesTaxRate = 0.065 if $State eq "Arkansas";
    $StateSalesTaxRate = 0.075 if $State eq "California";
    $StateSalesTaxRate = 0.029 if $State eq "Colorado";
    $StateSalesTaxRate = 0.0635 if $State eq "Connecticut";
    $StateSalesTaxRate = 0 if $State eq "Delaware";
    $StateSalesTaxRate = 0.06 if $State eq "Florida";
    $StateSalesTaxRate = 0.04 if $State eq "Georgia";
    $StateSalesTaxRate = 0.04 if $State eq "Guam";
    $StateSalesTaxRate = 0.04 if $State eq "Hawaii";
    $StateSalesTaxRate = 0.06 if $State eq "Idaho";
    $StateSalesTaxRate = 0.0625 if $State eq "Illinois";
    $StateSalesTaxRate = 0.07 if $State eq "Indiana";
    $StateSalesTaxRate = 0.06 if $State eq "Iowa";
    $StateSalesTaxRate = 0.0615 if $State eq "Kansas";
    $StateSalesTaxRate = 0.06 if $State eq "Kentucky";
    $StateSalesTaxRate = 0.04 if $State eq "Louisiana";
    $StateSalesTaxRate = 0.055 if $State eq "Maine";
    $StateSalesTaxRate = 0.06 if $State eq "Maryland";
    $StateSalesTaxRate = 0.0625 if $State eq "Massachusetts";
    $StateSalesTexRate = 0.06 if $State eq "Michigan";
    $StateSalesTaxRate = 0.06875 if $State eq "Minnesota";
    $StateSalesTaxRate = 0.07 if $State eq "Mississippi";
    $StateSalesTaxRate = 0.04225 if $State eq "Missouri";
    $StateSalesTaxRate = 0 if $State eq "Montana";
    $StateSalesTaxRate = 0.055 if $State eq "Nebraska";
    $StateSalesTaxRate = 0.0685 if $State eq "Nevada";
    $StateSalesTaxRate = 0 if $State eq "New Hampshire";
    $StateSalesTaxRate = 0.07 if $State eq "New Jersey";
    $StateSalesTaxRate = 0.05125 if $State eq "New Mexico";
    $StateSalesTaxRate = 0.04 if $State eq "New York";
    $StateSalesTaxRate = 0.0475 if $State eq "North Carolina";
    $StateSalesTaxRate = 0.05 if $State eq "North Dakota";
    $StateSalesTaxRate = 0.0575 if $State eq "Ohio";
    $StateSalesTaxRate = 0.045 if $State eq "Oklahoma";
    $StateSalesTaxRate = 0 if $State eq "Oregon";
    $StateSalesTaxRate = 0.06 if $State eq "Pennsylvania";
    $StateSalesTaxRate = 0.105 if $State eq "Puerto Rico";
    $StateSalesTaxRate = 0.07 if $State eq "Rhode Island";
    $StateSalesTaxRate = 0.06 if $State eq "South Carolina";
    $StateSalesTaxRate = 0.04 if $State eq "South Dakota";
    $StateSalesTaxRate = 0.07 if $State eq "Tennessee";
    $StateSalesTaxRate = 0.0625 if $State eq "Texas";
    $StateSalesTaxRate = 0.0595 if $State eq "Utah";
    $StateSalesTaxRate = 0.06 if $State eq "Vermont";
    $StateSalesTaxRate = 0.053 if $State eq "Virginia";
    $StateSalesTaxRate = 0.065 if $State eq "Washington";
    $StateSalesTaxRate = 0.06 if $State eq "West Virginia";
    $StateSalesTaxRate = 0.05 if $State eq "Wisconsin";
    $StateSalesTaxRate = 0.04 if $State eq "Wyoming";
    return($UnitPrice*(1+$StateSalesTaxRate));
}

Main();

Без включения строгой прагмы Perl вы даже получите идентичный вывод:

100
106.0
100
105.0

Но если строгий включен, вы получите следующее сообщение об ошибке при запуске этого Perl-скрипта:

Global symbol "$StateSalesTexRate" requires explicit package name at line 37.
Execution aborted due to compilation errors. 

Проблема в обоих примерах заключается в опечатке в одной из строк вычислений. У меня есть StateSalesTexRate вместо StateSalesTaxRate для строки расчета налога с продаж для штата Мичиган. Perl явно находит и устраняет эту ошибку. Тем временем Python поворачивает голову и смотрит в другую сторону.

Это большое дело. Представьте, что это программное обеспечение используется вашим онлайн-бизнесом для расчета суммы, которую вы снимаете с кредитной карты клиента. Сколько времени пройдет, прежде чем вы поймете, что клиенты из Мичигана получают пропуск по налогу с продаж? Когда вы это сделаете, вы вернетесь к покупателю и скажете: «Извините, нам нужно от вас больше денег», или вы сами съедите потерю?

Конечно, у любой компании, использующей этот тип алгоритма кодирования для расчета налога с продаж, вероятно, есть более серьезные проблемы. Но на этом примере вы можете ясно увидеть, что делает прагма strict в Perl и почему я и другие считают, что она должна быть важной особенностью любого языка сценариев.

Есть много вещей, которые мне действительно нравятся в Python. Я понимаю, почему некоторые люди предпочитают Python Perl. Но есть несколько вещей, которые я действительно ненавижу в Python. Это один.

person Rodney Kadura    schedule 03.12.2015
comment
Хотел бы я проголосовать за это сто раз! strict столько раз спасал мою задницу в этой ситуации. Ваш пример тривиален, но представьте, что вы обнаружите этот тип ошибки в коде, который используется для анализа медицинских данных и принятия решений о лечении! Вы можете подумать, что это надумано, но я это видел! use strict спасает жизни! - person ipetrik; 27.12.2017
comment
Честно говоря, это крайне уродливый код, который любой кодировщик переформатировал бы именно из-за подобных ошибок. И ide также будет отмечать эту переменную, если не весь блок кода. Привод нереалистичного примера на самом деле не подходит вам. Тот факт, что вам нужно отклониться назад, чтобы найти пример, в котором требуется этот строгий режим, указывает на то, что строгий режим требуется редко. - person Nearoo; 11.10.2018
comment
@Nearoo Вы предполагаете, что у вас есть приличный набор инструментов. 3 месяца назад я работал над сценарием из 700 строк, написанным на чем-то не совсем похожем на Visual Basic, встроенном в современный текущий продукт. Поставляемый редактор вообще не имел никакого ума. Я применил все передовые методы форматирования этого сценария, которые только мог придумать, но явная опция по-прежнему сохраняла мою задницу несколько раз. - person Peter M; 24.07.2020

Чтобы запустить Python с включенными предупреждениями:

python -W all file.py

В ответ на:

Есть ли что-то, что я должен делать в обычном порядке для моих скриптов Python?

Я думаю, что в целом неплохо убедиться, что ваш код соответствует PEP 8. Как упоминалось в другом ответе, вы можете сделать это программно:

pip install pep8 && pep8 file.py
person Jian    schedule 25.09.2013

LeoNerd дает прекрасное объяснение того, почему в Python нет «строгого использования» или «предупреждений об использовании».

В ответ на:

Есть ли что-то, что мне следует делать в обычном порядке для моих скриптов Python?

Возможно, вам будет интересно запустить свой код с помощью статического анализатора кода, такого как pylint, и / или проверки форматирования кода, например pep8.

Они могут помочь найти потенциальные проблемы и пометить предупреждения. Они также могут многое сказать о форматировании вашего кода, которое может вас заинтересовать, а может и не заинтересовать.

Вот достойное обоснование их использования. И соответствующие вопросы по Stackoverflow здесь и здесь.

person Sean    schedule 28.02.2013

На самом деле нет никакого эквивалента. Дизайн Python со временем эволюционировал, и было внесено множество изменений (особенно в 3.x), чтобы гарантировать, что значения по умолчанию на языке соответствуют тому, что разработчик хочет по умолчанию. Очень редко функция существует, но является необязательным флагом.

Вероятно, это сводится к Дзен Python «Должно быть один - а желательно только один - очевидный способ сделать это ». Дизайн Python сосредоточен на удобочитаемости, и наличие множества способов выполнения или изменения способа работы языка затрудняет чтение кода.

Я бы сказал, что наиболее близким из них является импорт из __future__ в более старые версии Python в ввести некоторые исправления / новые функции из более новых версий в более старые версии (например, деление, переходящее от целочисленного к делению с плавающей запятой по умолчанию). Это похоже на то, что улучшает поведение по умолчанию, делая его более разумным в стандартном случае.

Изменить: похоже, я вызвал гнев пользователей Perl, которые рассматривают этот пост как атаку на Perl - он никогда не задумывался как таковой. Perl - прекрасный язык, в моем исходном посте просто использовались плохие формулировки и не было ясного объяснения. Я попытался уточнить.

person Gareth Latty    schedule 16.11.2012
comment
Мне нравится, что вы употребили слово «вменяемый». РЖУ НЕ МОГУ. Я тоже не думаю, что у python есть безумный режим. - person jdi; 17.11.2012
comment
Круто, я предполагаю, что среди прочего люди говорят мне сначала просто изучить Python. - person jon_shep; 17.11.2012
comment
Нет причин, по которым этот ответ дает -3 без объяснения причин. - person jordanm; 17.11.2012
comment
Да, есть какое-нибудь объяснение этому? - person Gareth Latty; 17.11.2012
comment
__future__ звучит ближе к use 5.012;, который запрашивает версию языка 5.12 (которая, кстати, включает use strict;) - person ikegami; 17.11.2012
comment
@ikegami Да, это самое близкое, что я мог придумать, чтобы упомянуть, это определенно не прямая параллель. - person Gareth Latty; 17.11.2012
comment
@jordanm Я думаю, что это была ненависть к этому ответу из-за неудавшегося ответа ниже (уже удаленного). - person jon_shep; 17.11.2012
comment
-1, потому что он не обращается к use strict; (как упоминалось в вопросе), а просто машет рукой с разумным поведением - я бы сказал, что Python, будучи динамически типизированным, имеет ту же бессмысленную систему типов Perl, но я отвлекся .. - person ; 17.11.2012
comment
@pst Нет эквивалента. По умолчанию Python использует поведение, которое вы хотите в общем случае. Я никогда не говорил, что Perl имеет плохую систему типов, все, что я имел в виду под разумным, это то, что вы хотели в общем случае - спрашивающий говорит, что он всегда добавляет эти строки в файл, так почему бы и нет по умолчанию для этого? - person Gareth Latty; 17.11.2012
comment
почему ребята из javascript добавили в свой язык прагму "use strict"? - person Tudor Constantin; 17.11.2012
comment
Здравомыслие - это вопрос перспективы. Интересное обсуждение того, почему Perl по умолчанию не use strict здесь: stackoverflow.com/questions/6050031/ - person RobEarl; 17.11.2012
comment
@TudorConstantin Потому что Java Script, такой как Perl, иначе не предупредил бы вас о вещах, которые он принимает, хотя они работали бы иначе, чем вы предполагали. - person Piotr Dobrogost; 17.11.2012
comment
@RobEarl Я не верю, что обратная совместимость - это всегда хорошо. Python 3 нарушил совместимость, что принесло огромную пользу пользователям. Да, это может вызвать проблемы, но стоит убедиться, что мы сможем исправить прошлые ошибки. Я не говорю, что каждый язык должен быть Python или что его идеология идеальна, просто она соответствует моим предпочтениям. Я думаю, что моя разумная формулировка вызвала здесь проблемы - она ​​была задумана как легкое замечание о хорошем дизайне Python, а не как атака на Perl. - person Gareth Latty; 18.11.2012
comment
use strict "vars", если вы не знаете, что он делает, требует, чтобы пользователи определяли свою переменную в области видимости, прежде чем можно будет назначить ее или прочитать из нее. Это позволяет избежать многих типографских ошибок, поскольку без этого требования опечатанная переменная является допустимой переменной, содержащей неопределенное значение, а не синтаксической ошибкой. Если бы PHP имел use strict нативный эквивалент, это был бы немного более безопасный язык. - person Kent Fredric; 18.11.2012
comment
@KentFredric Я не совсем уверен, на кого это было направлено (особенно с комментарием PHP), но объявления действительно не кажутся мне ценными - если вы попытаетесь получить доступ к переменной, которая не существует, вы получите NameError, если вы установите его, то, когда вы начнете использовать его позже, вы получите NameError или неожиданное поведение. Подобные проблемы очень очевидны, случаются не часто и легко решаются. Я не вижу смысла в объявлении каждой переменной - это потратит больше времени, чем сэкономит. Тем не менее, в Python нет такой вещи, как объявление переменной. - person Gareth Latty; 18.11.2012
comment
@KentFredric, это твоя точка зрения. Моя, как Perl-программиста, относительно свободно владеющая Python, заключается в том, что это одна из самых неприятных пропущенных функций Python. Требование объявления переменных позволяет выявлять множество ошибок во время компиляции и значительно повышает надежность моих скриптов. - person salva; 18.11.2012
comment
Нет, по умолчанию python позволяет вам делать опечатки в именах переменных в целом. Кроме того, объявление переменных имеет вторую цель, которая НАМНОГО полезнее - заявляя о своем намерении ввести переменную, которую компилятор / исполняющая система может обнаружить, когда вы пытаетесь создать переменную, которая уже существует, тем самым предотвращая вас от ужасной ошибки. случайного уничтожения ваших данных. - person Altreus; 20.11.2012
comment
@Altreus Ты действительно это делаешь? Я имею в виду, на самом деле, если вы пишете в разумном стиле с небольшими блоками кода, практически невозможно создать две переменные с одним и тем же именем, а если вы это сделаете, это обычно явно очевидно. Я просто чувствую, что люди всегда преувеличивают реальные проблемы, связанные с подобными вещами. Я много пишу на Python, а этого просто не происходит. - person Gareth Latty; 20.11.2012
comment
Если вы попытаетесь получить доступ к несуществующей переменной, вы получите ошибку NameError. Я не очень пользуюсь Python, поэтому я не знаю, но происходит ли это во время выполнения? то есть: во время доступа к переменной или во время компиляции, то есть: проверка лексического синтаксиса. use strict "vars" - это проверка синтаксиса во время лексической компиляции, поэтому она выполняется еще до запуска кода. Люди часто реализуют то же поведение на языках, в которых нет этой функции, с помощью какой-либо программы Linting. (Например, в PHP есть сторонняя утилита, которая это проверяет) - person Kent Fredric; 02.12.2012
comment
И мои заявления не столько нацелены на людей, сколько на то, чтобы внести техническую ясность в обсуждаемые статьи. знак равно Я использовал как свою долю Python, так и PHP, и я стараюсь не допускать языковых предубеждений. Но строгие переменные - это то, что мне нравится в Perl, и чего не хватает в PHP. - person Kent Fredric; 02.12.2012
comment
Проблема Альтреуса действительно актуальна только в контексте областей видимости, то есть: она возникает только в том случае, если вы совершаете ошибку, используя одно и то же имя переменной в том же контексте. Например, я недавно наблюдал за PHP-кодом, который допустил ошибку, имея 2-третий цикл for, случайно использующий одно и то же имя переменной для каждого уровня. Он просто таинственным образом бежал вечно, и человеку пришлось наблюдать за ошибкой, чтобы понять, что это произошло. - person Kent Fredric; 02.12.2012
comment
Python имеет тенденцию иметь это реже, поскольку переменные / объекты в более высоких областях не всегда неявно видны во внутренних областях, тогда как как в Perl, так и в PHP определение / использование переменной в более высокой области делает ее видимой для всех внутренних областей (и фундаментальная функция, необходимая для реализации замыканий в Perl). - person Kent Fredric; 02.12.2012
comment
Я думаю, что некоторым людям не хватает реальной проблемы: когда вы назначаете переменную, которая уже существует, если у вас есть опечатка, тогда в python вы просто получаете новую переменную, где, как и в perl с использованием strict vars, вы получаете ошибку времени компиляции . Очевидно, что в этом отношении perl превосходит. Утверждать, что фитон более «разумный», нелепо ... поскольку он не обеспечивает того же, что и perl, с меньшим количеством пользовательских параметров. - person Myforwik; 13.03.2013

Это не ошибка времени компиляции, но у Python есть много линтеров, которые могут идентифицировать тот же тип ошибок, что и Perl "use strict":

Рассмотрим файл Python с именем tmp.py с:

def foo():
    a = 1
    b = 2
    return a

flake8 tmp.py вернет:

tmp.py:13:5: F841 local variable 'b' is assigned to but never used

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

person Garrett    schedule 10.12.2019