Python: AttributeError: объект «int» не имеет атрибута «isalpha»

Я хочу создать функцию Cipher's Cipher в python, используя клиент/сервер. Клиент отправляет сообщение с ключом, а сервер шифрует его. Код сервера:

import socket

def getCaesar(message, key):
    result = ""
    for l in message:
        if l.isalpha():
            num = ord(l)
            num += key

            if l.isupper():
                if num > ord('Z'):
                    num -= 26
                elif num < ord('A'):
                    num += 26

            elif l.islower():
                if num > ord('z'):
                    num -= 26
                elif num < ord('a'):
                    num += 26

            result += chr(num)
        else:
            result += l
return result    

serverSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=socket.gethostname()
port=4000

serverSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

serverSock.bind((host,port))
serverSock.listen(5)
print("Listenting for requests")
while True:
    s,addr=serverSock.accept()
    print("Got connection from ",addr)
    print("Receiving...")

    message=s.recv(1024)
    key=s.recv(1024)

    resp=getCaesar(message, key)
    print('Ciphertext: ')
    print(resp)

serverSock.close()

Строка, которая продолжает вызываться, это строка 6: 'if l isalpha(): ' и дает мне ошибку: AttributeError: объект «int» не имеет атрибута «isalpha». Что означает эта ошибка?

Клиентская программа:

import socket

def getMessage():
    print('Enter your message:')
    return input()

def getKey():
    key = 0
    while True:
        print('Enter the key number (1-%s)' % (26))
        key = int(input())
        if (key >= 1 and key <= 26):
            return key

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=socket.gethostname()
port=4000
s.connect((host,port))


message = getMessage()
key = getKey()

message=message.encode()


s.send(message)
s.send(bytes(key))
cipher= s.recv(1024)

print('Ciphertext: ')
print(cipher)
s.close()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
3 443
1

Ответы 1

В Python 3 socket recv возвращает неизменяемую последовательность bytes. Каждый элемент имеет тип int и находится в диапазоне [0, 255]. isalpha — это метод str, а не метод int.

Если вы хотите обрабатывать ответ сервера как строку, вы можете декодировать байты.

string = response.decode('utf-8')

for c in string:
    if c.isalpha():
        [...]

Это избавило от этой ошибки, но теперь указывает на строку 10 в ключе getCaesar: num += с ошибкой: TypeError: неподдерживаемые типы операндов для +=: 'int' и 'bytes'. Имеет ли вообще значение, что клиентская программа имеет: message=message.encode()?

B.Uriah 18.02.2019 07:20

Другие вопросы по теме