Почему я становлюсь “ожидаемым блок с отступом”, когда я пытаюсь запустить свой скрипт Python? [закрытый]

6
задан e-satis 14 February 2010 в 19:04
поделиться

6 ответов

Вы, вероятно, смешиваете табуляции с пробелами. Он выглядит с отступом, но на самом деле это не так.


Ваш код выдает другую ошибку:

for ch in f:                                                  \
  ( translatedToken = english_hindi_dict[ch] )                \
    if (ch in english_hindi_dict) else (translatedToken = ch)
                                                        ↑

SyntaxError: invalid syntax

Возможно, вы имели в виду:

for ch in f:
  if ch in english_hindi_dict:
    translatedToken = english_hindi_dict[ch]
  else:
    translatedToken = ch

Возможно, вы имели в виду:

for ch in f:
  translatedToken = english_hindi_dict[ch] if ch in english_hindi_dict else ch

Оба должны работать нормально, и я ожидаю, что второй будет быстрее, чем первый

Они оба могут быть оптимизированы в translated = str (english_hindi_dict.get (ch, ch) for ch in f) , но вопрос не в этом.

13
ответ дан 8 December 2019 в 02:14
поделиться

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

Когда у вас есть такой оператор, как:

if true:
pass

, он будет жаловаться, потому что нет оператора с отступом для if . Вам нужно будет исправить это так:

if true:
    pass

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

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

11
ответ дан 8 December 2019 в 02:14
поделиться

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

-121--5086086-

OK. После некоторых исследований и испытаний я выяснил проблему. После отключения UAC, межсетевого экрана и скрипта, который все еще не работает, я прокопал немного глубже и обнаружил, что основной проблемой было то, как команда invoke-command выполняет команды. он использует полномочия пользователя, выполняющего сценарий, для аутентификации на сервере, а затем пытается использовать другую учетную запись для запуска разрешений или понижает привилегии пользователя, чтобы определенные команды не могли быть выполнены.

Я добавил переключатель -Credentials к команде invoke, и сейчас все работает отлично. Исправленный пример кода ниже:

$user = New-Object Management.Automation.PSCredential("$UserName", $securePassword)
invoke-command -ComputerName $ComputerName -Credential $user -ScriptBlock ` 
{ 
    cd C:\Windows\System32\inetsrv\;  
    ./appcmd.exe ADD vdir /app.name:<SiteName>/ /path:/<VDir Name> /physicalPath:<Path to files> 
} 
-121--3196940-

IndentationError может быть вызван большим количеством различных событий. С верхней части головы:

  • Забывая вообще отступить.

    Python использует отступы для разделения синтаксических блоков. Например:

     при will_is_awesome:
    print «Вы правы»
    остальное:
    Напечатайте «Ты лжешь!»
    

    Вы получите ошибку IndentationError: ожидаемая ошибка блока с отступом , если вы забудете об отступе. Например,

    , если will_is_awesome:
    print «Вы правы»
    остальное:
    Напечатайте «Ты лжешь!»
    
  • Комментирование блока с отступом.

    Например,

    , если light_is_green:
    go_now ()
    остальное:
    # go_anyway ()
    do_something_else ()
    

    Это приведет к появлению IndentationError: ожидаемый блок с отступом , поскольку комментарий делает строку после else: пустой для синтаксического анализатора. Добавление инструкции pass устранит проблему. Например,

    , если light_is_green:
    go_now ()
    остальное:
    # go_anyway ()
    проход
    do_something_else ()
    
  • Смешанные вкладки и места в отступах.

    Позиции табуляции могут различаться между различными машинами и редакторами. Если вы правильно смешиваете вкладки и места, вы можете получить ошибку, но она обычно приводит к IndentationError: unindent не соответствует какому-либо уровню внешнего отступа , поэтому вряд ли это будет вашей проблемой. Это все равно стоит знать. Рекомендуется никогда не использовать вкладки в коде Python.

3
ответ дан 8 December 2019 в 02:14
поделиться

Python определяет блоки по отступу, а не по символам { и } , как C / C ++ / Java / PHP / ... выполняет или по if / endif или begin / end пары, найденные в некоторых других языках. Так что будьте осторожны с отступами - смешивать табуляции и пробелы тоже нехорошо.

1
ответ дан 8 December 2019 в 02:14
поделиться

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

Так, например, если взять PHP:

if ($blah == 'foo')
{
  // this is line 1 of my code block
  // this is line 2
}

То в Python это будет:

if blah == 'foo':
    # this is line 1 of my code block
    # this is line 2
    pass

Не могли бы вы привести код с точной ошибкой?

2
ответ дан 8 December 2019 в 02:14
поделиться

Редактирование ответа в соответствии с примером кода.

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch)  

это просто не корректный Python.

Во-первых, читабельность. Ваш код трудно читать и, следовательно, трудно отлаживать. Что такое "ch" и "f"? Более того, в Python можно сделать одну строку, но это не рекомендуется, поэтому поместите for в отдельную строку. Затем сделайте отступ.

for chunk in file: 
    ( translatedToken = english_hindi_dict[chunk] ) if (chunk in english_hindi_dict) else (translatedToken = chunk)

Теперь мы видим, что не так. Вы присваиваете переменные в условном операторе. В Python это недопустимо. Я предполагаю, что у вас есть опыт работы на C/C++ и вы привыкли так делать. В Python вы не можете этого делать, чтобы предотвратить написание обфусцированного кода. В итоге получается:

for chunk in file: 
    translatedToken = english_hindi_dict[chunk] if chunk in english_hindi_dict else chunk

Этот кусок кода должен работать, если вы используете Python 2.5+. Но троичный оператор пока недоступен в более старой версии Python. Давайте сделаем его немного дружелюбнее:

for chunk in file: 
    translatedToken = chunk
    if chunk in english_hindi_dict:
        translatedToken = english_hindi_dict[chunk]

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

for chunk in file: 
    try:
        translatedToken = english_hindi_dict[chunk]
    except KeyError:
        translatedToken = chunk

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

for chunk in file: 
    translatedToken = english_hindi_dict.get(chunk, chunk)

В качестве заключения: не пытайтесь писать на Python так, как вы писали на C, или на Java так, как вы писали бы на Perl. Другой инструмент, другой стиль.


Чтобы решить эту проблему, запустите в вашем редакторе функцию "поиск и замена" и сделайте огромную "заменить все", чтобы изменить все табуляции на 4 пробела, или наоборот. Затем сделайте отступы во всех блоках, и, наконец, выровняйте все инструкции в одном блоке.

Забавно, что это не появилось раньше на SO. В конце концов, это действительно не так очевидно.

В Python вы разделяете блоки с помощью пробелов или табуляции, а не "{".

Поэтому каждый раз, когда вы переходите к блоку (функция, цикл, класс и т.д.), вы должны делать отступы в коде. Это не просто хорошая практика, это обязательно. Если вы этого не сделаете, ваша программа потерпит крах.

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

Например:

if (age > 18)
{
    printf("You can vote")
}

Становится:

if age > 18:
    print("You can vote")

В большинстве языков вы можете сделать:

if (age > 18)
{
printf("You can vote")
}

В Python вы не можете:

if age > 18:
print("You can vote")

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

if age > 18:
    print("You can vote")
    print("How cool is that ?")

Можно, но:

if age > 18:
    print("You can vote")
   print("How cool is that ?")

вызовет исключение.

В конце концов, вы не можете смешивать табуляцию и пробелы в одном блоке. Поэтому:

if age > 18:
    print("You can vote")
    print("How cool is that ?")

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

В большинстве редакторов есть функция глобального "поиска и замены", которая позволит вам решить любую проблему, которая может возникнуть. Некоторые, такие как Geany или Ulipad, даже имеют функцию "заменить все табуляции пробелами".

13
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: