Python 2 dan python 3gacha

Bu ikki uslubni python2 dan python3 ga tarjima qilishda muammo yuzaga keldi.

Python2:

def send(self, data):
    if self.debug:
        print 'Send:',
        print ':'.join('%02x' % ord(c) for c in data)
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print 'Recv:',
        print ':'.join('%02x' % ord(c) for c in data)
    return data

Python 3 Bugungi kunga qadar men shunday qilganman:

def send(self, data):
    if self.debug:
        print('Send:', end=' ')
        print(':'.join('%02x' % ord(c) for c in data))
    l0 = len(data.encode('utf-8')) & 0xFF
    l1 = (len(data.encode('utf-8')) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print('Recv:', end=' ')
        print(':'.join('%02x' % ord(c) for c in data))
    return data

Men bu xatoni davom ettiraman:

TypeError: ord() expected string of length 1, but int found

Har qanday yordamni qadrlash kerak. rahmat

0
Siz allaqachon 2to3 vositasiga murojaat qildingizmi? Xatoni bartaraf etishda siz str o'rniga bayt ob'ektiga ega bo'lishingiz kerak, bu esa uni qaytarish vaqtida ints da to'g'ridan-to'g'ri kod beradi, shuning uchun ord ustiga bosing.
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba

6 javoblar

Kodni Python 3 da ishlashi uchun murojaat qilishingiz kerak bo'lgan ikkita asosiy turdagi muammolar mavjud.

Eng katta masala shundan iboratki, strings va baytlar Python-3 da bir xil turlar bilan ifodalanmaydi. str turi Unicode strings uchun, bayt turi esa ikkilik ma'lumot uchun. data </​​code> argumenti, ehtimol bayt bo'lishi kerak (u siz to'g'ridan-to'g'ri rozetkaga yuborganingizdan). Unicode satrlarini qo'llab-quvvatlashni xohlagan bo'lsangiz, ularni kodlashda (masalan, "UTF-8" ) kodlash bilan ularni encode() kerak.

data </​​code> misolini qabul qilsangiz, kodga bir nechta kichik o'zgartirish kiritib, bir nechta API qanday ishlashi uchun str va baytlar :

  1. Bir baytda qiymatini o'zgartirish, har bir bayt qiymatini beradi, lekin butun sonlar sifatida bitta belgigacha baytestrings sifatida emas. Bu asosan nashri va recv ning birinchi qismlarida ord shart emas deganidir.

  2. chr funktsiyasi bayt misoli emas, balki str hosil qiladi va siz har xil turlarni birlashtira olmaysiz. bayt misolini tamsaytdan yaratish biroz noqulay ( bayt (some_number) siz xohlagan narsani qilmaydi), lekin mumkin.

Sizda mavjud bo'lgan boshqa masala juda oddiy. Python-3da print - bu iborani emas, balki funksiyadir, shuning uchun argumentlarni atrofida parantez kerak. Bundan tashqari, satr yakunlarini bostirish uchun turli sintaksisdan foydalaniladi.

Kodingizning to'liq o'rnatilgan versiyasi:

def send(self, data):
    if self.debug:
        print('Send:', end='')                     # new way to suppress the newline
        print(':'.join('%02x' % c for c in data))  # add parentheses, no need for ord
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = bytes([l0, l1]) + data                     # build prefix bytestring differently
    self.sock.send(d)

def recv(self):
    l0, l1 = self.sock.recv(2)              # no need for ord, unpack directly as ints
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print('Recv:', end='')
        print(':'.join('%02x' % c for c in data))
    return data

Note that the struct module may offer a more elegant way of encoding and decoding the length of your data to a bytestring. For instance, struct.pack(" could replace several lines of the code in send (you wouldn't need l0 and l1).

2
qo'shib qo'ydi
help (bayt) null bilan boshlangan parametr tomonidan berilgan bayt (iterable_of_ints) -> baytlar "va" bayt (int) -> bayt (num) o'rniga bayt ([num]) amalga oshiradigan yagona belgi bayt ob'ektini yaratish uchun
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
Ha, lekin nima uchun bayt (num) nima uchun bir bayt qilmasligini aniqlay olmaysiz. Men O'X ga nima keragi borligini eslayman deb o'yladim. (Menga kelib, buni men aytgan bo'lardim) Holbuki, bu juda yaxshi shakllangan javob.
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
@ TadhgMcDonald-Jensen: Yo, bu men aytgan noqulaylik. bayt ([l0]) + bayt ([l1]) kerak emas. Faqat ikkala son bilan bitta ro'yxatidan oldindan birlashtirilgan banttring yaratishingiz mumkin. struct.pack funktsiyasi yana ham yaxshiroq (garchi u menga kerakli endianness noto'g'ri belgisi bo'lsa).
qo'shib qo'ydi muallif Blckknght, manba
@Blckknght Juda katta rahmat, bu juda foydali!
qo'shib qo'ydi muallif Dawzer, manba

Kodni Python 3 da ishlashi uchun murojaat qilishingiz kerak bo'lgan ikkita asosiy turdagi muammolar mavjud.

Eng katta masala shundan iboratki, strings va baytlar Python-3 da bir xil turlar bilan ifodalanmaydi. str turi Unicode strings uchun, bayt turi esa ikkilik ma'lumot uchun. data </​​code> argumenti, ehtimol bayt bo'lishi kerak (u siz to'g'ridan-to'g'ri rozetkaga yuborganingizdan). Unicode satrlarini qo'llab-quvvatlashni xohlagan bo'lsangiz, ularni kodlashda (masalan, "UTF-8" ) kodlash bilan ularni encode() kerak.

data </​​code> misolini qabul qilsangiz, kodga bir nechta kichik o'zgartirish kiritib, bir nechta API qanday ishlashi uchun str va baytlar :

  1. Bir baytda qiymatini o'zgartirish, har bir bayt qiymatini beradi, lekin butun sonlar sifatida bitta belgigacha baytestrings sifatida emas. Bu asosan nashri va recv ning birinchi qismlarida ord shart emas deganidir.

  2. chr funktsiyasi bayt misoli emas, balki str hosil qiladi va siz har xil turlarni birlashtira olmaysiz. bayt misolini tamsaytdan yaratish biroz noqulay ( bayt (some_number) siz xohlagan narsani qilmaydi), lekin mumkin.

Sizda mavjud bo'lgan boshqa masala juda oddiy. Python-3da print - bu iborani emas, balki funksiyadir, shuning uchun argumentlarni atrofida parantez kerak. Bundan tashqari, satr yakunlarini bostirish uchun turli sintaksisdan foydalaniladi.

Kodingizning to'liq o'rnatilgan versiyasi:

def send(self, data):
    if self.debug:
        print('Send:', end='')                     # new way to suppress the newline
        print(':'.join('%02x' % c for c in data))  # add parentheses, no need for ord
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = bytes([l0, l1]) + data                     # build prefix bytestring differently
    self.sock.send(d)

def recv(self):
    l0, l1 = self.sock.recv(2)              # no need for ord, unpack directly as ints
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print('Recv:', end='')
        print(':'.join('%02x' % c for c in data))
    return data

Note that the struct module may offer a more elegant way of encoding and decoding the length of your data to a bytestring. For instance, struct.pack(" could replace several lines of the code in send (you wouldn't need l0 and l1).

2
qo'shib qo'ydi
help (bayt) null bilan boshlangan parametr tomonidan berilgan bayt (iterable_of_ints) -> baytlar "va" bayt (int) -> bayt (num) o'rniga bayt ([num]) amalga oshiradigan yagona belgi bayt ob'ektini yaratish uchun
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
Ha, lekin nima uchun bayt (num) nima uchun bir bayt qilmasligini aniqlay olmaysiz. Men O'X ga nima keragi borligini eslayman deb o'yladim. (Menga kelib, buni men aytgan bo'lardim) Holbuki, bu juda yaxshi shakllangan javob.
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
@ TadhgMcDonald-Jensen: Yo, bu men aytgan noqulaylik. bayt ([l0]) + bayt ([l1]) kerak emas. Faqat ikkala son bilan bitta ro'yxatidan oldindan birlashtirilgan banttring yaratishingiz mumkin. struct.pack funktsiyasi yana ham yaxshiroq (garchi u menga kerakli endianness noto'g'ri belgisi bo'lsa).
qo'shib qo'ydi muallif Blckknght, manba
@Blckknght Juda katta rahmat, bu juda foydali!
qo'shib qo'ydi muallif Dawzer, manba

Kodni Python 3 da ishlashi uchun murojaat qilishingiz kerak bo'lgan ikkita asosiy turdagi muammolar mavjud.

Eng katta masala shundan iboratki, strings va baytlar Python-3 da bir xil turlar bilan ifodalanmaydi. str turi Unicode strings uchun, bayt turi esa ikkilik ma'lumot uchun. data </​​code> argumenti, ehtimol bayt bo'lishi kerak (u siz to'g'ridan-to'g'ri rozetkaga yuborganingizdan). Unicode satrlarini qo'llab-quvvatlashni xohlagan bo'lsangiz, ularni kodlashda (masalan, "UTF-8" ) kodlash bilan ularni encode() kerak.

data </​​code> misolini qabul qilsangiz, kodga bir nechta kichik o'zgartirish kiritib, bir nechta API qanday ishlashi uchun str va baytlar :

  1. Bir baytda qiymatini o'zgartirish, har bir bayt qiymatini beradi, lekin butun sonlar sifatida bitta belgigacha baytestrings sifatida emas. Bu asosan nashri va recv ning birinchi qismlarida ord shart emas deganidir.

  2. chr funktsiyasi bayt misoli emas, balki str hosil qiladi va siz har xil turlarni birlashtira olmaysiz. bayt misolini tamsaytdan yaratish biroz noqulay ( bayt (some_number) siz xohlagan narsani qilmaydi), lekin mumkin.

Sizda mavjud bo'lgan boshqa masala juda oddiy. Python-3da print - bu iborani emas, balki funksiyadir, shuning uchun argumentlarni atrofida parantez kerak. Bundan tashqari, satr yakunlarini bostirish uchun turli sintaksisdan foydalaniladi.

Kodingizning to'liq o'rnatilgan versiyasi:

def send(self, data):
    if self.debug:
        print('Send:', end='')                     # new way to suppress the newline
        print(':'.join('%02x' % c for c in data))  # add parentheses, no need for ord
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = bytes([l0, l1]) + data                     # build prefix bytestring differently
    self.sock.send(d)

def recv(self):
    l0, l1 = self.sock.recv(2)              # no need for ord, unpack directly as ints
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print('Recv:', end='')
        print(':'.join('%02x' % c for c in data))
    return data

Note that the struct module may offer a more elegant way of encoding and decoding the length of your data to a bytestring. For instance, struct.pack(" could replace several lines of the code in send (you wouldn't need l0 and l1).

2
qo'shib qo'ydi
help (bayt) null bilan boshlangan parametr tomonidan berilgan bayt (iterable_of_ints) -> baytlar "va" bayt (int) -> bayt (num) o'rniga bayt ([num]) amalga oshiradigan yagona belgi bayt ob'ektini yaratish uchun
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
Ha, lekin nima uchun bayt (num) nima uchun bir bayt qilmasligini aniqlay olmaysiz. Men O'X ga nima keragi borligini eslayman deb o'yladim. (Menga kelib, buni men aytgan bo'lardim) Holbuki, bu juda yaxshi shakllangan javob.
qo'shib qo'ydi muallif Tadhg McDonald-Jensen, manba
@ TadhgMcDonald-Jensen: Yo, bu men aytgan noqulaylik. bayt ([l0]) + bayt ([l1]) kerak emas. Faqat ikkala son bilan bitta ro'yxatidan oldindan birlashtirilgan banttring yaratishingiz mumkin. struct.pack funktsiyasi yana ham yaxshiroq (garchi u menga kerakli endianness noto'g'ri belgisi bo'lsa).
qo'shib qo'ydi muallif Blckknght, manba
@Blckknght Juda katta rahmat, bu juda foydali!
qo'shib qo'ydi muallif Dawzer, manba

insteed of print foydalanishni bosib chiqarish (a) quyidagi kabi: python 2.x:

def send(self, data):
    if self.debug:
        print 'Send:',
        print ':'.join('%02x' % ord(c) for c in data)
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print 'Recv:',
        print ':'.join('%02x' % ord(c) for c in data)
    return data

python 3.x:

def send(self, data):
    if self.debug:
        print ('Send:'),
        print (':'.join('%02x' % ord(c) for c in data))
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print ('Recv:'),
        print (':'.join('%02x' % ord(c) for c in data))
    return data
0
qo'shib qo'ydi

insteed of print foydalanishni bosib chiqarish (a) quyidagi kabi: python 2.x:

def send(self, data):
    if self.debug:
        print 'Send:',
        print ':'.join('%02x' % ord(c) for c in data)
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print 'Recv:',
        print ':'.join('%02x' % ord(c) for c in data)
    return data

python 3.x:

def send(self, data):
    if self.debug:
        print ('Send:'),
        print (':'.join('%02x' % ord(c) for c in data))
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print ('Recv:'),
        print (':'.join('%02x' % ord(c) for c in data))
    return data
0
qo'shib qo'ydi

insteed of print foydalanishni bosib chiqarish (a) quyidagi kabi: python 2.x:

def send(self, data):
    if self.debug:
        print 'Send:',
        print ':'.join('%02x' % ord(c) for c in data)
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print 'Recv:',
        print ':'.join('%02x' % ord(c) for c in data)
    return data

python 3.x:

def send(self, data):
    if self.debug:
        print ('Send:'),
        print (':'.join('%02x' % ord(c) for c in data))
    l0 = len(data) & 0xFF
    l1 = (len(data) >> 8) & 0xFF
    d = chr(l0) + chr(l1) + data
    self.sock.send(d)

def recv(self):
    data = self.sock.recv(2)
    l0 = ord(data[0])
    l1 = ord(data[1])
    plen = l0 + (l1 << 8)
    data = self.sock.recv(plen)
    if self.debug:
        print ('Recv:'),
        print (':'.join('%02x' % ord(c) for c in data))
    return data
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming