синтаксическая ошибка из-за нескольких функций верхнего уровня в Python? - PullRequest
0 голосов
/ 12 октября 2011

Я искал и нашел очень похожий вопрос здесь Синтаксическая ошибка при попытке определить несколько функций в python?

, но на этот вопрос не было ответа

Iя получаю синтаксическую ошибку при втором "def".Мой отступ может быть испорчен здесь, потому что я не могу выяснить форматирование в этом месте .... НО это правильно в моей программе, отступ не является проблемой.

def encryptChar(ch, key):
    newOrd = ord(ch) + key % 26
    if ord(ch) < 65:
        newOrd = ord(ch)
    elif ord(ch) < 91:
        if newOrd > 90:
            newOrd = newOrd - 26
        elif newOrd > 122:
            newOrd = newOrd - 26
    newch = chr(newOrd)
    return newch

def encryptString(string, key):
    newString = ""
    for i in range(len(string)):
         newString += encryptChar(string[i], key)
    return newString

def decryptString(string, key):
    newString = ""
    for i in range(len(string)):
         newString += encryptChar(string[i], -1*key)
    return newString

Я Угадаю, что это имеетчто-то делать с функциями все верхнего уровня.Но как мне это исправить?Это Python 2.7.(Я мог бы включить верхнюю функцию в другие 2, но у меня все еще осталось 2 верхних уровня)

Спасибо за любую помощь!

Ответы [ 6 ]

3 голосов
/ 12 октября 2011

Я смог запустить ваш код без проблем, как только исправил ошибку отступа:

def encryptString(string, key):
   newString = ""
   for i in range(len(string)):
        newString += encryptChar(string[i], key)
   return newString    # << HERE

Демонстрация: http://codepad.org/eaaiHUJZ

Я бы также переписал ваш код следующим образом:

# because encryption is misnomer here
def rotateChar(ch, key):
    if 'a' <= ch < 'z':
        newOrd = (ord(ch) - ord('a') + key) % 26
        return chr(newOrd + ord('a'))
    elif 'A' < ch < 'Z':
        newOrd = (ord(ch) - ord('A') + key) % 26
        return chr(newOrd + ord('A'))
    else:
        return ch

def rotateString(st, key):
   return ''.join(rotateChar(c, key) for c in st)

def derotateString(st, key):
   return ''.join(rotateChar(c, -key) for c in st)

Демонстрация: Python 3 , Python 2

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

2 голосов
/ 12 октября 2011

В сообщении об ошибке указано, что именно не так:

  File "test.py", line 17
    return newString
                   ^
IndentationError: unindent does not match any outer indentation level

В строке return newString уровень отступа не соответствует предыдущему уровню отступа в строке for i in range(len(string)).

Вы должны исправить свой отступ в целом - использовать постоянный уровень отступа (например, 2 или 4 пробела) во всем вашем коде.Быть последовательным.Прямо сейчас, ваши отступы повсюду - каждый раз, когда вы делаете отступ, они переходят на другой уровень.

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

1 голос
/ 12 октября 2011

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

def encryptChar(ch, key):
    newOrd = ord(ch) + key % 26
    if ord(ch) < 65:
        newOrd = ord(ch)
    elif ord(ch) < 91:
        if newOrd > 90:
            newOrd = newOrd - 26
    elif newOrd > 122:
        newOrd = newOrd - 26
    newch = chr(newOrd)
    return newch

def encryptString(string, key):
    newString = ""
    for i in range(len(string)):
        newString += encryptChar(string[i], key)
    return newString

def decryptString(string, key):
    newString = ""
    for i in range(len(string)):
        newString += encryptChar(string[i], -1*key)
    return newString
1 голос
/ 12 октября 2011

Проблема в том, что return newString имеет уровень отступа 4 символа, который не соответствует более ранней строке на этом уровне, которая была в 3 символа. Попробуйте использовать редактор, который позволит вам всегда вводить 4 пробела; написание Python будет очень болезненным, если вам придется все выстраивать вручную и продолжать сталкиваться с такими ошибками.

1 голос
/ 12 октября 2011

Я не получил синтаксическую ошибку в начале вашей функции, но в конце ее ...

def encryptString(string, key):
   newString = ""
   for i in range(len(string)):
        newString += encryptChar(string[i], key)
    return newString 

Ваш оператор return имеет отступ на один пробел дальше, чем остальныефункция, вызывающая IndentationError.

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

0 голосов
/ 12 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...