Ответы пользователя по тегу Python
  • Unittest в корне python проекта?

    sumej
    @sumej Автор вопроса
    DevOps
    new_project
    ├── init__.py
    ├── antigravity/
    │ ├── __init__.py # make it a package
    │ └── antigravity.py
    └── test/
    ├── __init__.py # also make test a package
    └── test_antigravity.py

    test_antigravity.py:
    # import the package
    import antigravity

    python test_antigravity.py
    python test/test_antigravity.py
    И тут он падает и не может найти antigravity.
    А вот как это работает:
    $ cd new_project
    $ python -m unittest test.test_antigravity
    Ответ написан
    Комментировать
  • Как передать из python скрипта json для ajax запроса?

    sumej
    @sumej
    DevOps
    >сделать сайт учета студентов
    учёт оценок? посещаемости?
    >И какую бд лучше использовать если условия задания такого
    >Предполагаются частые выборки по фильтрам (включая комбинации): фамилия, группа, семестр, средний балл
    Поиск можно и через сфинкс можно и через майскуэль Полнотекстовый поиск и его возможности


    >Студенты могут часто переходить из одной группы в другую
    Не нагрузка.
    >Предполагаются частые выборки по фильтрам (включая комбинации): фамилия, группа, семестр, средний балл
    >Студентов будет много (порядка 1-2 млн)
    Если sql не справляется на SELECT. Тогда нужно будет думать =)

    >И как правильно вообще начинать писать без фреймворка?
    from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
    from os import curdir, sep
    
    PORT_NUMBER = 8080
    
    #This class will handles any incoming request from
    #the browser 
    class myHandler(BaseHTTPRequestHandler):
    	
    	#Handler for the GET requests
    	def do_GET(self):
    		if self.path=="/":
    			self.path="/index_example2.html"
    
    		try:
    			#Check the file extension required and
    			#set the right mime type
    
    			sendReply = False
    			if self.path.endswith(".html"):
    				mimetype='text/html'
    				sendReply = True
    			if self.path.endswith(".jpg"):
    				mimetype='image/jpg'
    				sendReply = True
    			if self.path.endswith(".gif"):
    				mimetype='image/gif'
    				sendReply = True
    			if self.path.endswith(".js"):
    				mimetype='application/javascript'
    				sendReply = True
    			if self.path.endswith(".css"):
    				mimetype='text/css'
    				sendReply = True
    
    			if sendReply == True:
    				#Open the static file requested and send it
    				f = open(curdir + sep + self.path) 
    				self.send_response(200)
    				self.send_header('Content-type',mimetype)
    				self.end_headers()
    				self.wfile.write(f.read())
    				f.close()
    			return
    
    
    		except IOError:
    			self.send_error(404,'File Not Found: %s' % self.path)
    
    try:
    	#Create a web server and define the handler to manage the
    	#incoming request
    	server = HTTPServer(('', PORT_NUMBER), myHandler)
    	print 'Started httpserver on port ' , PORT_NUMBER
    	
    	#Wait forever for incoming htto requests
    	server.serve_forever()
    
    except KeyboardInterrupt:
    	print '^C received, shutting down the web server'
    	server.socket.close()

    >Запись в эти таблицы будет вестись в конкурентом режиме доступа. Возможно нужно будет использовать блокировки либо всю работу спрятать в транзакции sql:
    import threading
    class Repository:
        def __init__(self):       
            self.__lock=threading.Lock()
       def add(self):
           with self.__lock:
                with open(self.config_path,"r") as json_data:
                    try:
                        data = json.load(json_data)
                    except:
                        logging.critical( "FATAL!!!can't read %s" % data)
                        raise ValueError("can't json.load(%s)" % data)

    import MySQLdb
    #Start a connection
    db= MySQLdb.connect(host="dbhost", user="dbuser" , passwd="dbpass", db="dbname")
    db.autocommit(False)
    cursor = db.cursor()
    try:
     cursor.execute("Your SQL")
     cursor.execute("Another sql")
     db.commit()
    except:
     db.rollback()

    запуск uwsgi --ini env.ini того же Flask/Falcon/etc
    env.ini:
    # it's example how run
    [uwsgi]
    plugins = python27
    http-socket = :80
    #pythonpath = /srv/myapp
    #virtualenv  = /home/project/ve
    chdir = /home/project
    processes = 1
    threads = 4
    #pythonpath = ..
    module = manager:app
    # This line below was important
    #wsgi-file = manager.py
    #callable = app
    # Turn this off for production
    catch-exceptions = true
    stats = /.tmp/.uwsgi-stats.socket
    touch-reload = /.tmp/.uwsgi-reload
    Ответ написан
    Комментировать
  • PIP или esay_install: что лучше?

    sumej
    @sumej
    DevOps
    Я пользуюсь pip. Тем не менее есть много подводных камней, примеры в статье "Почему я ненавижу virtualenv и pip перевод":
    pip каждый раз собирает из исходников

    Кажется, pip умышленно был лишён возможности easy_install устанавливать пакеты из бинарников (eggs). Несмотря на то, что распространение бинарников было значимой частью python-платформы и, кстати, вполне работоспособной, видимо, кто-то решил, что это плохая идея. Конечно, с точки зрения разработчиков, компиляция пакетов из исходников есть очевидное благо, которое позволяет им не компилировать предварительно пакет под каждую из всех поддерживаемых платформ (а переложить это на несомненно обрадованного этим пользователя — прим. пер.). Но компиляция становится злом в том случае, если целевых платформ немного, и вы точно знаете её/их и хотели бы собрать пакет заранее, избавившись от необходимости иметь компилятор на целевом компьютере

    Этот чёртов requirements.txt

    Те разработчики, которые пишут лишь приложения, не вполне понимают все особенности создания пакетов, поэтому, недолго думая, просто «захардкоживают» весь ассортимент используемых ими модулей в своё приложение, просто перечисляя их в requirements.txt, ведь это так удобно! Эти разработчики чаще всего просто советуют пользователям установить venv, а затем накатить в него свой пакет командой pip install -r requirements.txt.

    В результате мы имеем некоторое количество python-разработчиков, которые считают requirements.txt панацеей от всех проблем. Они даже никогда не узнают о существовании setuptools. Их легко покоряет кажущимся простым тупое перечисление ссылок на необходимые пакеты, лежащие где-то в недрах интернета: на сайтах или в системах контроля версий. Меня обескураживает их святая уверенность в «фантастической» прагматичности этого подхода и вытекающем отсюда желании пропагандировать использование virtualenv+pip как связки незаменимых инструментов для всех и каждого.

    URI в качестве путей к зависимостям это отстой

    setuptools позволяет вам указать имя и необходимую версию пакета, который по умолчанию скачивается с Pypi. Pypi обеспечивает индексацию, но вы можете создать и свой собственный индекс (в виде простых HTML страниц) и указать, что информацию следует извлекать в первую очередь из них, а не с сайта Pypi. Кто бы ни разработал эту технологию, он пытался предоставить разработчику возможность привязываться к именам пакетов, а не их физическому местоположению или веб-протоколу. И он мыслил правильно.
    Если вы в requirements.txt указываете путь к локальному файлу или к лежащему на каком-нибудь сайте тарболлу, по факту вы захардкоживаете эту ссылку. Хотя в данном случае лучшим выходом было бы использование репозитория пакетов. Который позволил бы людям, например, настроить зеркала на него в своей локальной сети. Кроме того, вы не можете указать минимальную версию, лишь только точную текущую. А в один прекрасный день тот самый файлик с пакетом переместится или удалится, в общем, пропадёт, и код внезапно перестанет работать. Совершенно очевидно, что мы этого не хотим, ведь так?

    Если вам по нраву pip freeze, с вами что-то не так
    У меня хорошо получается отслеживать свои зависимости и управлять ими. Я делаю это с помощью pip freeze. Команду pip freeze используют для того, чтобы убедиться, что никакие Python-зависимости не были упущены посреди цикла разработки. Если вы полагаете, что pip freeze выдаёт вам список зависимостей как раз для вставки в requirements.txt (который, напомню, не нужен) — тогда вы просто используете --no-site-packages (который тоже не нужен) при создании нового venv, и весь набор зависимостей всё равно получается глобально-системным, а не питоньим. А, и кроме того, таким образом не узнать, какие из ваших зависимостей установлены напрямую, а какие подтянуты другими.

    и что используете вы для контроля пакетами?

    pip вполне подойдет.
    Установить пакет pip install MyProject
    Обновить пакет pip install --upgrade MyProject
    Установить определённую версию пакета pip install MyProject==1.0
    В общем:
    Usage:
      pip <command> [options]
    
    Commands:
      install                     Install packages.
      uninstall                   Uninstall packages.
      freeze                      Output installed packages in requirements format.
      list                        List installed packages.
      show                        Show information about installed packages.
      search                      Search PyPI for packages.
      wheel                       Build wheels from your requirements.
      zip                         DEPRECATED. Zip individual packages.
      unzip                       DEPRECATED. Unzip individual packages.
      help                        Show help for commands.
    Ответ написан
    Комментировать
  • Обезопасить прием pickle сообщений?

    sumej
    @sumej
    DevOps
    Я понимаю, что речь идёт про Exploiting Misuse of Python's "Pickle", Playing with Pickle Security.
    В данной статье он еще и медленный
    Don't Pickle Your Data:
    Pickle is slow

    Pickle is both slower and produces larger serialized values than most of the alternatives.
    To illustrate this, I put together a simple benchmark comparing pickle to the built in JSON module, the Apache Thrift library, and MessagePack. This benchmark measures the number of objects a second each of these libraries can read and write. The data being serialized here are just randomly generated fake 'Tweet' objects containing just four fields:

    Pickle is the clear underperformer here. Even the 'cPickle' extension thats written in C has a serialization rate thats about a quarter that of JSON or Thrift. Pickle also produces serialized values that are around double the size of Thrift or MessagePack.


    Но на что бы я обратил внимание:
    Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.


    Я думаю лучше поискать другое решение.
    Ответ написан
    Комментировать
  • Как настроить локальний сервер python на mac OS X?

    sumej
    @sumej
    DevOps
    Нужно узнать ип вашего компьютера и зайти по нему. Вроде бы по умолчанию ваш сервер будет на всех ип:
    #python -m SimpleHTTPServer 8000
    Serving HTTP on 0.0.0.0 port 8000 ...
    Mac OS X (10.4) - Finding the IP address and MAC a...
    Mac OS X (10.5.x, 10.6.x, 10.7.x, 10.8.x, 10.9.x, ...
    Ответ написан
    1 комментарий
  • Почему использование 'object.get_attribute()' лучше, чем object.attribute?

    sumej
    @sumej
    DevOps
    self.x - хм...
    pythoner.name/documentation/tutorial/classes/private
    В Python не существует "частных" (приватных) переменных экземпляра, т.е. тех, которые не могут быть доступны, кроме как изнутри объекта. Тем не менее есть соглашение, которое поддерживается большей частью кода Python: идентификатор с префиксом нижней черты (например _spam) должны рассматриваться как непубличная часть API (будь то функция, метод или элемент данных). Следует учитывать, детали реализации и предмет могут быть изменены без предварительного уведомления.
    Поскольку есть действительные прецеденты для приватных для класса идентификаторов (а именно, чтобы избежать конфликтов имен с именами, определенными подклассами), есть ограниченная поддержка такого механизма, называемого корректировкой имен (name mangling). Любой идентификатор вида __spam (по крайней мере с двумя первыми подчеркиваниями и не более чем одним завершающим) текстуально заменяются на _classname__spam, где имя класса - это текущее имя класса с начальным символом(ами) подчеркивания. Эта корректировка делается безотносительно к синтаксической позиции идентификатора тех пор, пока это происходит в определении класса.
    Корректировка имен полезна для того, чтобы позволить подклассам переопределять методы, не нарушая внутриклассовых вызовов методов. Например:
    class Mapping:
        def __init__(self, iterable):
            self.items_list = []
            self.__update(iterable)
     
        def update(self, iterable):
            for item in iterable:
                self.items_list.append(item)
     
        __update = update   # private copy of original update() method
     
    class MappingSubclass(Mapping):
     
        def update(self, keys, values):
            # provides new signature for update()
            # but does not break __init__()
            for item in zip(keys, values):
                self.items_list.append(item)
    Ответ написан
    Комментировать
  • Как правильно использовать отступы в python?

    sumej
    @sumej
    DevOps
    pastebin.com/UZf6vWz4
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import random
    
    number=random.randint(1, 10)
    
    hello = (str(raw_input("Жмакай Y, если хочешь сыграть в угадайку, ну или N, чтобы пропустить блок ")))
    running=True
    
    if hello == "Y":
        while running:
            try:
                guess = int(raw_input('Введите целое число : '))
            except KeyboardInterrupt:
                break
            except:
                print('Это не число. }:(')
                continue
            if guess == number:
                 print('Поздравляю, вы угадали.')
                 running = False # это останавливает цикл while
            elif guess < number:
                 print('Нет, загаданное число немного больше этого')
            else:
                 print('Нет, загаданное число немного меньше этого.')
    else:
        print('Завершение.')
    Ответ написан
    Комментировать