1

Тема: Python - запитання

Вітаю
підкажіть, як поснити цій зміюці, що довжина str = 4 ???

>>> str='дупа'
>>> print len(str)
8

бо через ці перекодування невірно працюють методи стрінгів типу rjust(), ljust() та подібні

2

Re: Python - запитання

Взагалі, вбудованим функціям не пасує присвоювати щось інше...

Ви на яких потужностях це запускали? У мене якось лише четвірку пише.

3

Re: Python - запитання

>>> str = 'дупа'
>>> str = str.decode('utf-8')
>>> len(str)

І зауваження Bartash'а доцільне.

Подякували: ping1

4 Востаннє редагувалося ping (14.09.2013 14:17:31)

Re: Python - запитання

Replace написав:
>>> str = 'дупа'
>>> str = str.decode('utf-8')
>>> len(str)

І зауваження Bartash'а доцільне.

:)
звісно, це я нашвидку настукав в терміналі приклад.
поправляюся:

>>> s='дупа'
>>> print len(s)
8
>>> 

Ви на яких потужностях це запускали? У мене якось лише четвірку пише.

запущено на локалці, лінукс, utf-8

>>> s
'\xd0\xb4\xd1\x83\xd0\xbf\xd0\xb0'
>>> print s
дупа
>>> 
[b]str = str.decode('utf-8')[/b]

Дякую.
а не можна це якось  глобально пояснити десь на початку контролера, щоб не тикати скрізь по коду?

5

Re: Python - запитання

Можна написати щось типу len_utf8 :)

>>> def len_utf(s):
...     return len(s.decode('utf-8'))
... 
>>> len_utf('дупа')
4

6 Востаннє редагувалося ping (14.09.2013 21:07:30)

Re: Python - запитання

Replace написав:

Можна написати щось типу len_utf8 :)

>>> def len_utf(s):
...     return len(s.decode('utf-8'))
... 
>>> len_utf('дупа')
4

та я так і зробив:

def strf(string, length, feel):
    newstring = ''
    l_string=len(string.decode('utf-8'))
    for i in range(0,length,1):
        if i<l_string:
            newstring = newstring+string[i]
        else:
            newstring = newstring+feel
    return newstring 

але, хотілося красиво, через str.rjust(width[, fillchar]) і т.п.

p.s.
ніфіга воно не працює :( бо змішуються різні кодування і виходить дупа.
а писати сторінку коду заради вирівнювання полів в відображенні не буду.

7

Re: Python - запитання

@ping

Тут така ситуація...

But UTF-8 has a dark side, a single character can take up anywhere between one to six bytes to represent in binary.

>>> len(u'\u0040'.encode('utf-8'))
1
>>> len(u"\u5b57".encode('utf-8'))
3
>>> u'\u5b57'.encode('utf-8')
'\xe5\xad\x97'
>>> u'\u0040'.encode('utf-8')
'@' (or '\x40')

Більше тут. Далі по тексту

If you want to know the real length of a string (or more correctly the number of characters,) you should encode your binary string into a unicode string:

>>> len(u'\u5b57')
1
>>> raw_utf8_data = '\xe5\xad\x97'
>>> len(raw_utf8_data)
3
>>> print raw_utf8_data
>>> raw_utf8_data.decode('utf-8')
u'\u5b57'
>>> len(raw_utf8_data.decode('utf-8'))
1

З.І: і на завершення додам, що у вінді-хрюхрю len('дупа') == 4.
Така магія.

8

Re: Python - запитання

Я розумію що на Python 3 всі все ще перейти не зможуть, але вже з Python 2.6 в своєму коді на початку можна написати:

from __future__ import unicode_literals

І все буде ок:

assert len('дупа') == 4
Подякували: ping, koala3

9

Re: Python - запитання

ping написав:

ніфіга воно не працює :( бо змішуються різні кодування і виходить дупа.
а писати сторінку коду заради вирівнювання полів в відображенні не буду.

Тому що всі рядки в програмі повинні бути в unicode, а вже при вводі-виводі кодуватись в яке-небудь utf-8.

P.S. Раджу прочитати ось це.

Подякували: ping1

10

Re: Python - запитання

bunyk написав:

Я розумію що на Python 3 всі все ще перейти не зможуть, але вже з Python 2.6 в своєму коді на початку можна написати:

from __future__ import unicode_literals

І все буде ок:

>>> t='дупа'
>>> print t.ljust(50,'-')
дупа----------------------------------------------
>>> print t.rjust(50,'-')
----------------------------------------------дупа
>>> 

урррааа!!!

щодо 3-го змія - то , на жаль. web2py на нього ще не переповз, а він мені вже встиг сподобатися :)

11 Востаннє редагувалося koala (15.09.2013 06:57:15)

Re: Python - запитання

Я на Пайтоні не пишу, але конструкція мені сподобалася. Скажіть, а можна зробити щось на кшталт

from __future__ import antigrav
from __future__ import T1000
from __future__ import perpetuum_mobile

і т.д.?

12

Re: Python - запитання

не все так добре з цим варіантом:

from __future__ import unicode_literals

перестав працювати Mail

db.py:

from gluon.tools import time, Mail

## create all tables needed by auth if not custom tables
auth.define_tables()

## configure email
mail=auth.settings.mailer
###mail = Mail()
mail.settings.server = 'localhost:25'
mail.settings.sender = 'PO@bimbom.com.ua'
mail.settings.login = None

кусок контролера контактної форми:

   if form.process().accepted:
       response.flash = 'form accepted'
       mail.send(to = 'vh@anywhere.com', sender='PO@bimbom.com.ua',
                 subject = form.vars.subject,
                 message = 'Повідомлення від '+form.vars.name+'\n------------------\n'+form.vars.message,
                )
   
       redirect(URL('default','index'))

видає:
<type 'exceptions.Exception'> Server address not specified
Function argument list

(self=<gluon.tools.Mail object>, to='vh@anywhere.com', subject='DNS', message='\xd0\x9f\xd0\xbe\xd0\xb2\xd1\x96\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbd\xd1\x8f \xd0\xb2\xd1\x96\xd0\xb4 ret\n------------------\nhf', attachments=None, cc=None, bcc=None, reply_to=None, sender='PO@bimbom.com.ua', encoding='utf-8', raw=False, headers={})

Code listing

        sender = sender or self.settings.sender

        if not isinstance(self.settings.server, str):
            raise Exception('Server address not specified')

        if not isinstance(sender, str):
            raise Exception('Sender address not specified')

        if not raw and attachments:

13

Re: Python - запитання

@koala

antigrav давно придуманий: ще Уеллс зробив імпорт з __future__, коли писав "Перші люди на місяці", а далі якийсь вчений (здс, загинув за нез'ясованих обставин) випустив реліз цього модуля. Щоправда, разом з автором цей форк пішов в архіви...

@ping

А ви з цікавості вивели би тип поля self.settings.server у зневад-режимі на екран. Скидається на те, що там не str, а unicode стало.

14

Re: Python - запитання

Так, всі літерали стають юнікодовими, окрім тих яким задати префікс b (байти):

>>> from __future__ import unicode_literals
>>> 'asdf'
u'asdf'
>>> type('asdf')
<type 'unicode'>
>>> type(b'asdf')
<type 'str'>

Зокрема код:

sender='PO@bimbom.com.ua'

треба переписати як

sender=b'PO@bimbom.com.ua'

або

sender='PO@bimbom.com.ua'.encode('utf-8')

Інші аргументи напевне теж варто закодувати, десь в документації повинно бути написано які дані вона приймає - текст чи байти.

Подякували: ping1

15 Востаннє редагувалося ping (15.09.2013 12:51:16)

Re: Python - запитання

Helpers can also be serialized into strings, equivalently, with the __str__ and the xml methods:

>>> print str(DIV("hello world"))
<div>hello world</div>
>>> print DIV("hello world").xml()
<div>hello world</div>

добре, а якщо мені треба зворотній процес?
маємо :
a='DIV("hello world")'
треба:
a=DIV("hello world")

????????
питання з web2py, але думаю, в Django має бути щось аналогічне.

п.с.
в моєму випадку рішення:
{{=BODY(XML(a))}}

16

Re: Python - запитання

Привіт народ, мені потрібно всановити модуль до пітона netinfo, зробити це маю під Ubuntu 12.04, хто знає яким чином це зробити буду вдячний за допомогу.

17

Re: Python - запитання

Я такого модуля в інтернеті не знайшов. А нащо він вам?

18

Re: Python - запитання

Можливо це він.
Використовуйте pip. Після того як встановите Pip спробуйте виконати команду

 pip install pynetinfo

В мене в дистрибутиві пакунок наз. python-pip (для 2-ї версії).

19

Re: Python - запитання

bunyk написав:

Я такого модуля в інтернеті не знайшов. А нащо він вам?

Для отримання інформації про мережеві інтерфейси.

20

Re: Python - запитання

Invader написав:

Можливо це він.
Використовуйте pip. Після того як встановите Pip спробуйте виконати команду

 pip install pynetinfo

В мене в дистрибутиві пакунок наз. python-pip (для 2-ї версії).

Error 503 Backend is unhealthy

Пробува встановити, пише що не може знайти.