[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Гыгыгы))), ну они наверняка есть)
     
  2. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Они выше. Тот же самый django глянь.
     
  3. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    у меня есть список, в котором некоторые элементы повторяются
    есть ли какая функция для создания списка без дублей или же модификации исходного?
     
  4. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    a = [1,2,3,4,5,6,2,2,3,3,4,4]
    b= set(a)
    print b
     
    1 person likes this.
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Помогите, cookielib почему-то не принимает все куки.

    Есть такой код
    Code:
        def request(self, host, handler, request_body, verbose=0):
            # dummy request class for extracting cookies 
            class CookieRequest(urllib2.Request):
                pass            
    
            # dummy response class for extracting cookies 
            class CookieResponse:
                def __init__(self, headers):
                    self.headers = headers
                def info(self):
                    return self.headers 
            verbose = 0
            crequest = CookieRequest('https://'+host+'/')
                
            # issue XML-RPC request
            h = self.make_connection(host)
            if verbose:
                h.set_debuglevel(1)
    
            self.send_request(h, handler, request_body)
            self.send_host(h, host)
            self.send_user_agent(h)
            
            # creating a cookie jar for my cookies
            cj = cookielib.LWPCookieJar()
    
            self.send_content(h, request_body)
    
            errcode, errmsg, headers = h.getreply()
            print str(headers)
            cresponse = CookieResponse(headers)
            cj.extract_cookies(cresponse, crequest)
    
            if len(cj) >0 and self.cookiefile != None:
                cj.save(self.cookiefile)
                    
            if errcode != 200:
                raise xmlrpclib.ProtocolError(
                    host + handler,
                    errcode, errmsg,
                    headers
                    )
    
            self.verbose = verbose
    
            try:
                sock = h._conn.sock
            except AttributeError:
                sock = None
                    
            return self._parse_response(h.getfile(), sock)
    
    Приходящие заголовки выглядят так:
    Code:
    Server: nginx/0.6.32
    Date: Mon, 18 May 2009 06:59:05 GMT
    Content-Type: text/xml; charset=utf-8
    Connection: close
    Set-Cookie: SAPE=tra-ta-ta; path=/; domain=.sape.ru
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Set-Cookie: p=a8de899da4; expires=Tue, 18-May-2010 06:59:02 GMT; path=/; domain=.sape.ru
    Суть - сохраняет только куку "p", но не "SAPE" возможно из-за отсутствия аттрибута expires. Как настроить, чтобы сохранялись все куки?
     
    _________________________
  6. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Попробуй такой вариант:
    Code:
    import urllib2
    import cookielib
    
    cookies = cookielib.CookieJar()
    proxy_handler = urllib2.ProxyHandler({"http":"10.10.10.10:3128"})
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), proxy_handler,)
    urllib2.install_opener(opener)
    temp_headers = urllib2.urlopen("www.sape.ru").info()
    print cookies
    
    По идее должны схаваться все куки - у меня по крайней мере ни разу не было проблем с таким вариантом - всгда все было ок, код твой если честно то просто не могу понять, наверное слишком глубоко для мну :(
     
    #146 login999, 18 May 2009
    Last edited: 18 May 2009
    3 people like this.
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    login999 Спасибо, но не то, это функция из класса для транспорта XMLRPC

    Проблема оказалась проста. cookiejar.save не сохранял expired куки, там специальный флаг для этого
     
    _________________________
    1 person likes this.
  8. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    недавно посетила мысль о том что понемногу заменить PyCurl на стандартные библиотеки.

    И тут возникли два вопроса, что пока не смог решить:
    Как запустить запрос через Socks4/5
    Как запустить запрос по https
     
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    urllib2 для http проксей, куков и т.д.
    для сокс свой openner написать, там не слишком сложно.
    Кстати как напишешь - плз выложи, интересно.
     
  10. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    PyCurl - выбросить нафик, ибо это:
    1. PHP -подход к Python
    2. Глючность , если внимательно погуглишь на тему вот этого поста то увидишь что это сишная ошибка, вылазила эта гадость при использовании pyCurl

    Socks4/Socks5 - SocksiPy
    https через Urllib2 без проблем открывается, никаких шаманств не нужно, правда нету handler для работы с https через прокси - придется что-то выдумывать на эту тему , на activestate есть пример кстати

    P.S. Народ подскажите как НОРМАЛЬНО реализовать такую вот цацку:

    Code:
    def Counter(Count=[0,]):
         Count.append(Count[0]+1)
         del Count[0]
         return Count[0]
    
    она то делает все что мне нужно - запоминает показания счетчика, только мну считает что юзать список ради этого дела некошерно, хотелось бы ФУНКЦИЮ, и чтоб он запоминала именно int
    делать переменную не проканает так как я заипусь потом прописывать global Counter везде где мне нужно будет его изменить, а global в функциях есть некошерно
     
    #150 login999, 22 May 2009
    Last edited: 22 May 2009
  11. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    Хотелось бы стандартными средствами... Если использовать сторонние библиотеки, то нашел
    http://socksipy.sourceforge.net/ , типа работа как с сокетами, только через сокс, если все работает, то достаточно интересно.
    А если самому реализовывать, то интересно посмотреть на этот исходник:
    http://www.koders.com/python/fidE472F1B0D8A02578C8960D2A1648A8D6049C6A40.aspx?s=icq#L114

    Ну тогда при моих интересах в принципе рано уходить от PyCurl, но правда меня смущает тот факт(как бы поэтому я и решил посмотреть что есть по данному вопросу) что нету версии PyCurl для Windows для версии 2.6.

    Хотя пока не собираюсь переходить на 2.6, ведь PyGame с которым активно играюсь пока что рекомендует 2.5... Но тенденция развития PyCurl не очень нравится (
     
  12. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    ыыы глянь на пост выше :)
     
    3 people like this.
  13. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    блин! Не увидел, на новую страницу все перебросило, а я пропустил твой пост. Спасибо! Посмотрю!

    По поводу Курла не согласен что это ПХП подход. Курл такая же библиотека как и другие, и если она используется в многих языках - это не делает ее ПХП-шной )
     
    #153 presidentua, 22 May 2009
    Last edited: 22 May 2009
  14. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    PHP:
    def Counter(Count=[0,]):
         
    Count.append(Count[0]+1)
         
    del Count[0]
         return 
    Count[0]
    А если так, тоесть глобальная переменная конечно есть, но одна в одном месте ):
    PHP:
    0
    def add
    ():
        global 
    a
        a
    +=1
        
    return a

    print add()
    print 
    add()
     
    1 person likes this.
  15. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Не совсем так, правильнее наверное будет сказать, что ее реализация есть под многие ЯП..., а вот пользуются ей в основной массе те, кто начал работать с PHP, а потом переходит на другие ЯП и ищут те инструменты, которыми привыкли пользоваться, на нынешней стадии развития питона(я имею ввиду 2,6,2), то единственное чего он не умеет и что поддерживает курл-это работа через соксы
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Моя ИМХА, не претендую на абсолютную правоту
     
  16. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Незачет - а теперь представь, что у меня 20 функций, которым нужно получение счетчика, причем все это чудо многопоточное и пиздючит ну допустим в 50 потоков... в эту функцию например не нужно даже локов встраивать, так как операция атомарная и при работе с threading проблем быть не должно (по крайней мере так написано), но я считаю некошерным то что для хранения одного-единственного числа приходится создавать список и потом с ним так извращаться
    То что я написал является паттерном типа - мну создает заготовки на все случаи жизни :)
    Использование же global :
    1. Некошерно
    2. Как пишут возможны проблемы как раз при многопоточности
     
    1 person likes this.
  17. cr0w

    cr0w Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    login999

    В твоей функции Lock, наверное, все же нужен: например, если поток выполняющий эту функцию исполнит код "Count.append(Count[0]+1)" и, не успев выполнить "del Count[0]", передаст управление другому потоку, который исполнит код этой функции целиком, то результат ее выполнения в первом потоке в итоге будет неверным.

    А использовать изменяемый объект в качестве дефолтного значения аргумента функции, на мой взгляд, даже "некошернее", чем использовать global. :)

    Как мне кажется, удобней было бы реализовать такой счетчик в виде класса.
     
    #157 cr0w, 23 May 2009
    Last edited: 23 May 2009
    1 person likes this.
  18. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Имхо классы это лишнее для таких целей
    Мну если честно интересует одно - функция-счетчик
    А насчет функции - я тут пораскинул моском - я не уверен насчет того, является ли del атомарной операцией, понял что я в этом не уверен и решил переделать эту функцию так:
    Code:
    def Counter (Number=[0]):
      Number[0] = Number[0]+1
      return Number[0]
    
    А насчет того что там используется изменяемый обьект - и что же здесь плохого? Если такое присваивание возможно, то почему бы его не использовать ?
    Тупо одна операция присваивания, теперь точно без локов можно
     
    #158 login999, 23 May 2009
    Last edited: 23 May 2009
  19. cr0w

    cr0w Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Лок все равно нужен: "Number[0] = Number[0]+1" - не атомрно. А классы, хмм, они очень удобны, даже для таких простых вещей.
    Насчет изменяемых объектов: я ж не написал, что не стоит этого использовать, а написал, что это "некошерно". Потому как для кого-то, просматривающего код этой функции, может быть неочевидным то, что список Number будет использоваться один и тот же при каждом вызове функции.
     
  20. Ergoproxy

    Ergoproxy Elder - Старейшина

    Joined:
    18 Jan 2008
    Messages:
    248
    Likes Received:
    155
    Reputations:
    45
    Всем ку! как при помощи py2exe создаать только один ехе файл?