mirror of
https://github.com/kennethreitz/python-guide.git
synced 2026-06-05 23:00:18 +00:00
Merge branch 'master' into standard-american-english
This commit is contained in:
@@ -33,7 +33,7 @@ New to Python? Let's properly setup up your Python environment:
|
|||||||
Python Development Environments
|
Python Development Environments
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
This part of the guide focus on the Python development environment,
|
This part of the guide focuses on the Python development environment,
|
||||||
and the best-practice tools that are available for writing Python code.
|
and the best-practice tools that are available for writing Python code.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
@@ -110,7 +110,7 @@ Additional Notes
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
This part of the guide, which is mostly prose, begins with some
|
This part of the guide, which is mostly prose, begins with some
|
||||||
background information about Python, then focuses on next steps.
|
background information about Python, and then focuses on next steps.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
@@ -137,8 +137,3 @@ Contribution notes and legal information (for those interested).
|
|||||||
notes/contribute
|
notes/contribute
|
||||||
notes/license
|
notes/license
|
||||||
notes/styleguide
|
notes/styleguide
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+36
-36
@@ -7,7 +7,7 @@ Your Development Environment
|
|||||||
Text Editors
|
Text Editors
|
||||||
::::::::::::
|
::::::::::::
|
||||||
|
|
||||||
Just about anything that can edit plain text will work for writing Python code,
|
Just about anything that can edit plain text will work for writing Python code;
|
||||||
however, using a more powerful editor may make your life a bit easier.
|
however, using a more powerful editor may make your life a bit easier.
|
||||||
|
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ using ``<Tab>`` key or any other customized keys.
|
|||||||
Emacs
|
Emacs
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Emacs is another powerful text editor. It is fully programmable (lisp), but
|
Emacs is another powerful text editor. It is fully programmable (Lisp), but
|
||||||
it can be some work to wire up correctly. A good start if you're already an
|
it can be some work to wire up correctly. A good start if you're already an
|
||||||
Emacs user is `Python Programming in Emacs`_ at EmacsWiki.
|
Emacs user is `Python Programming in Emacs`_ at EmacsWiki.
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ TextMate
|
|||||||
--------
|
--------
|
||||||
|
|
||||||
`TextMate <http://macromates.com/>`_ brings Apple's approach to operating
|
`TextMate <http://macromates.com/>`_ brings Apple's approach to operating
|
||||||
systems into the world of text editors. By bridging UNIX underpinnings and
|
systems into the world of text editors. By bridging Unix underpinnings and
|
||||||
GUI, TextMate cherry-picks the best of both worlds to the benefit of expert
|
GUI, TextMate cherry-picks the best of both worlds to the benefit of expert
|
||||||
scripters and novice users alike.
|
scripters and novice users alike.
|
||||||
|
|
||||||
@@ -117,8 +117,8 @@ Sublime Text
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
`Sublime Text <http://www.sublimetext.com/>`_ is a sophisticated text
|
`Sublime Text <http://www.sublimetext.com/>`_ is a sophisticated text
|
||||||
editor for code, markup and prose. You'll love the slick user interface,
|
editor for code, markup, and prose. You'll love the slick user interface,
|
||||||
extraordinary features and amazing performance.
|
extraordinary features, and amazing performance.
|
||||||
|
|
||||||
Sublime Text has excellent support for editing Python code and uses Python for
|
Sublime Text has excellent support for editing Python code and uses Python for
|
||||||
its plugin API. It also has a diverse variety of plugins,
|
its plugin API. It also has a diverse variety of plugins,
|
||||||
@@ -133,7 +133,7 @@ Atom
|
|||||||
editors.
|
editors.
|
||||||
|
|
||||||
Atom is web native (HTML, CSS, JS), focusing on modular design and easy plugin
|
Atom is web native (HTML, CSS, JS), focusing on modular design and easy plugin
|
||||||
development. It comes with native package control and plethora of packages.
|
development. It comes with native package control and a plethora of packages.
|
||||||
Recommended for Python development is
|
Recommended for Python development is
|
||||||
`Linter <https://github.com/AtomLinter/Linter>`_ combined with
|
`Linter <https://github.com/AtomLinter/Linter>`_ combined with
|
||||||
`linter-flake8 <https://github.com/AtomLinter/linter-flake8>`_.
|
`linter-flake8 <https://github.com/AtomLinter/linter-flake8>`_.
|
||||||
@@ -156,7 +156,7 @@ Python (on Visual Studio Code)
|
|||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
`Python for Visual Studio <https://marketplace.visualstudio.com/items?itemName=ms-python.python>`_ is an extension for the `Visual Studio Code IDE <https://code.visualstudio.com>`_.
|
`Python for Visual Studio <https://marketplace.visualstudio.com/items?itemName=ms-python.python>`_ is an extension for the `Visual Studio Code IDE <https://code.visualstudio.com>`_.
|
||||||
This is a free, light weight, open source IDE, with support for Mac, Windows, and Linux.
|
This is a free, lightweight, open source IDE, with support for Mac, Windows, and Linux.
|
||||||
Built using open source technologies such as Node.js and Python, with compelling features such as Intellisense (autocompletion), local and remote debugging, linting, and the like.
|
Built using open source technologies such as Node.js and Python, with compelling features such as Intellisense (autocompletion), local and remote debugging, linting, and the like.
|
||||||
|
|
||||||
MIT licensed.
|
MIT licensed.
|
||||||
@@ -192,7 +192,7 @@ toward working with scientific Python libraries (namely
|
|||||||
`pylint <http://www.logilab.org/857>`_ and
|
`pylint <http://www.logilab.org/857>`_ and
|
||||||
`rope <https://github.com/python-rope/rope>`_.
|
`rope <https://github.com/python-rope/rope>`_.
|
||||||
|
|
||||||
Spyder is open-source (free), offers code completion, syntax highlighting,
|
Spyder is open source (free), offers code completion, syntax highlighting,
|
||||||
a class and function browser, and object inspection.
|
a class and function browser, and object inspection.
|
||||||
|
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ WingIDE
|
|||||||
-------
|
-------
|
||||||
|
|
||||||
`WingIDE <http://wingware.com/>`_ is a Python specific IDE. It runs on Linux,
|
`WingIDE <http://wingware.com/>`_ is a Python specific IDE. It runs on Linux,
|
||||||
Windows and Mac (as an X11 application, which frustrates some Mac users).
|
Windows, and Mac (as an X11 application, which frustrates some Mac users).
|
||||||
|
|
||||||
WingIDE offers code completion, syntax highlighting, source browser, graphical
|
WingIDE offers code completion, syntax highlighting, source browser, graphical
|
||||||
debugger and support for version control systems.
|
debugger and support for version control systems.
|
||||||
@@ -211,11 +211,11 @@ NINJA-IDE
|
|||||||
|
|
||||||
`NINJA-IDE <http://www.ninja-ide.org/>`_ (from the recursive acronym: "Ninja-IDE
|
`NINJA-IDE <http://www.ninja-ide.org/>`_ (from the recursive acronym: "Ninja-IDE
|
||||||
Is Not Just Another IDE") is a cross-platform IDE, specially designed to build
|
Is Not Just Another IDE") is a cross-platform IDE, specially designed to build
|
||||||
Python applications, and runs on Linux/X11, Mac OS X and Windows desktop
|
Python applications, and runs on Linux/X11, Mac OS X, and Windows desktop
|
||||||
operating systems. Installers for these platforms can be downloaded from the
|
operating systems. Installers for these platforms can be downloaded from the
|
||||||
website.
|
website.
|
||||||
|
|
||||||
NINJA-IDE is open-source software (GPLv3 licence) and is developed
|
NINJA-IDE is open source software (GPLv3 licence) and is developed
|
||||||
in Python and Qt. The source files can be downloaded from
|
in Python and Qt. The source files can be downloaded from
|
||||||
`GitHub <https://github.com/ninja-ide>`_.
|
`GitHub <https://github.com/ninja-ide>`_.
|
||||||
|
|
||||||
@@ -224,11 +224,11 @@ Eric (The Eric Python IDE)
|
|||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
`Eric <http://eric-ide.python-projects.org/>`_ is a full featured Python IDE
|
`Eric <http://eric-ide.python-projects.org/>`_ is a full featured Python IDE
|
||||||
offering sourcecode autocompletion, syntax highlighting, support for version
|
offering source code autocompletion, syntax highlighting, support for version
|
||||||
control systems, python 3 support, integrated web browser, python shell,
|
control systems, Python 3 support, integrated web browser, python shell,
|
||||||
integrated debugger and a flexible plug-in system. Written in python, it is
|
integrated debugger, and a flexible plug-in system. Written in Python, it is
|
||||||
based on the Qt gui toolkit, integrating the Scintilla editor control. Eric
|
based on the Qt GUI toolkit, integrating the Scintilla editor control. Eric
|
||||||
is an open-source software project (GPLv3 licence) with more than ten years of
|
is an open source software project (GPLv3 licence) with more than ten years of
|
||||||
active development.
|
active development.
|
||||||
|
|
||||||
|
|
||||||
@@ -253,8 +253,8 @@ of the Python interpreter to be installed at the same time. This solves the
|
|||||||
problem of having different projects requiring different versions of Python.
|
problem of having different projects requiring different versions of Python.
|
||||||
For example, it becomes very easy to install Python 2.7 for compatibility in
|
For example, it becomes very easy to install Python 2.7 for compatibility in
|
||||||
one project, while still using Python 3.4 as the default interpreter.
|
one project, while still using Python 3.4 as the default interpreter.
|
||||||
pyenv isn't just limited to the CPython versions - it will also install PyPy,
|
pyenv isn't just limited to the CPython versions – it will also install PyPy,
|
||||||
anaconda, miniconda, stackless, jython, and ironpython interpreters.
|
Anaconda, miniconda, stackless, Jython, and IronPython interpreters.
|
||||||
|
|
||||||
pyenv works by filling a ``shims`` directory with fake versions of the Python
|
pyenv works by filling a ``shims`` directory with fake versions of the Python
|
||||||
interpreter (plus other tools like ``pip`` and ``2to3``). When the system
|
interpreter (plus other tools like ``pip`` and ``2to3``). When the system
|
||||||
@@ -276,7 +276,7 @@ IDLE
|
|||||||
----
|
----
|
||||||
|
|
||||||
:ref:`IDLE <python:idle>` is an integrated development environment that is
|
:ref:`IDLE <python:idle>` is an integrated development environment that is
|
||||||
part of Python standard library. It is completely written in Python and uses
|
part of the Python standard distribution. It is completely written in Python and uses
|
||||||
the Tkinter GUI toolkit. Though IDLE is not suited for full-blown development
|
the Tkinter GUI toolkit. Though IDLE is not suited for full-blown development
|
||||||
using Python, it is quite helpful to try out small Python snippets and
|
using Python, it is quite helpful to try out small Python snippets and
|
||||||
experiment with different features in Python.
|
experiment with different features in Python.
|
||||||
@@ -294,18 +294,18 @@ IPython
|
|||||||
`IPython <http://ipython.org/>`_ provides a rich toolkit to help you make the
|
`IPython <http://ipython.org/>`_ provides a rich toolkit to help you make the
|
||||||
most out of using Python interactively. Its main components are:
|
most out of using Python interactively. Its main components are:
|
||||||
|
|
||||||
* Powerful Python shells (terminal- and Qt-based).
|
* Powerful Python shells (terminal- and Qt-based)
|
||||||
* A web-based notebook with the same core features but support for rich media,
|
* A web-based notebook with the same core features but support for rich media,
|
||||||
text, code, mathematical expressions and inline plots.
|
text, code, mathematical expressions and inline plots
|
||||||
* Support for interactive data visualization and use of GUI toolkits.
|
* Support for interactive data visualization and use of GUI toolkits
|
||||||
* Flexible, embeddable interpreters to load into your own projects.
|
* Flexible, embeddable interpreters to load into your own projects
|
||||||
* Tools for high level and interactive parallel computing.
|
* Tools for high level and interactive parallel computing
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ pip install ipython
|
$ pip install ipython
|
||||||
|
|
||||||
To download and install IPython with all it's optional dependencies for the notebook, qtconsole, tests, and other functionalities
|
To download and install IPython with all its optional dependencies for the notebook, qtconsole, tests, and other functionalities:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -318,14 +318,14 @@ BPython
|
|||||||
Python interpreter for Unix-like operating systems. It has the following
|
Python interpreter for Unix-like operating systems. It has the following
|
||||||
features:
|
features:
|
||||||
|
|
||||||
* In-line syntax highlighting.
|
* In-line syntax highlighting
|
||||||
* Readline-like autocomplete with suggestions displayed as you type.
|
* Readline-like autocomplete with suggestions displayed as you type
|
||||||
* Expected parameter list for any Python function.
|
* Expected parameter list for any Python function
|
||||||
* "Rewind" function to pop the last line of code from memory and re-evaluate.
|
* "Rewind" function to pop the last line of code from memory and re-evaluate
|
||||||
* Send entered code off to a pastebin.
|
* Send entered code off to a pastebin
|
||||||
* Save entered code to a file.
|
* Save entered code to a file
|
||||||
* Auto-indentation.
|
* Auto-indentation
|
||||||
* Python 3 support.
|
* Python 3 support
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -341,12 +341,12 @@ library. It is considered to be an alternative to BPython_. Features include:
|
|||||||
* Syntax highlighting
|
* Syntax highlighting
|
||||||
* Autocompletion
|
* Autocompletion
|
||||||
* Multiline editing
|
* Multiline editing
|
||||||
* Emacs and VIM Mode
|
* Emacs and Vim Modes
|
||||||
* Embedding REPL inside of your code
|
* Embedding REPL inside of your code
|
||||||
* Syntax Validation
|
* Syntax validation
|
||||||
* Tab pages
|
* Tab pages
|
||||||
* Support for integrating with IPython_'s shell, by installing IPython
|
* Support for integrating with IPython_'s shell, by installing IPython
|
||||||
``pip install ipython`` and running ``ptipython``.
|
(``pip install ipython``) and running ``ptipython``.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. _pip-virtualenv:
|
.. _pip-virtualenv:
|
||||||
|
|
||||||
Further Configuration of Pip and Virtualenv
|
Further Configuration of pip and Virtualenv
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
.. image:: /_static/photos/34018732105_f0e6758859_k_d.jpg
|
.. image:: /_static/photos/34018732105_f0e6758859_k_d.jpg
|
||||||
@@ -105,7 +105,7 @@ need any configuration.
|
|||||||
When using older versions, you can configure pip in such a way that it tries to
|
When using older versions, you can configure pip in such a way that it tries to
|
||||||
reuse already installed packages, too.
|
reuse already installed packages, too.
|
||||||
|
|
||||||
On UNIX systems, you can add the following line to your :file:`.bashrc` or
|
On Unix systems, you can add the following line to your :file:`.bashrc` or
|
||||||
:file:`.bash_profile` file.
|
:file:`.bash_profile` file.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
@@ -124,7 +124,7 @@ add the following line to your :file:`pip.ini` file under ``[global]`` settings:
|
|||||||
|
|
||||||
download-cache = %HOME%\pip\cache
|
download-cache = %HOME%\pip\cache
|
||||||
|
|
||||||
Similarly, on UNIX systems you should simply add the following line to your
|
Similarly, on Unix systems you should simply add the following line to your
|
||||||
:file:`pip.conf` file under ``[global]`` settings:
|
:file:`pip.conf` file under ``[global]`` settings:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|||||||
+28
-14
@@ -212,7 +212,7 @@ Install virtualenv via pip:
|
|||||||
|
|
||||||
$ pip install virtualenv
|
$ pip install virtualenv
|
||||||
|
|
||||||
Test your installation
|
Test your installation:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -226,23 +226,26 @@ Basic Usage
|
|||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ cd my_project_folder
|
$ cd my_project_folder
|
||||||
$ virtualenv my_project
|
$ virtualenv venv
|
||||||
|
|
||||||
``virtualenv my_project`` will create a folder in the current directory which will
|
``virtualenv venv`` will create a folder in the current directory which will
|
||||||
contain the Python executable files, and a copy of the ``pip`` library which you
|
contain the Python executable files, and a copy of the ``pip`` library which you
|
||||||
can use to install other packages. The name of the virtual environment (in this
|
can use to install other packages. The name of the virtual environment (in this
|
||||||
case, it was ``my_project``) can be anything; omitting the name will place the files
|
case, it was ``venv``) can be anything; omitting the name will place the files
|
||||||
in the current directory instead.
|
in the current directory instead.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
'venv' is the general convention used globally. As it is readily available in ignore files (eg: .gitignore')
|
||||||
|
|
||||||
This creates a copy of Python in whichever directory you ran the command in,
|
This creates a copy of Python in whichever directory you ran the command in,
|
||||||
placing it in a folder named :file:`my_project`.
|
placing it in a folder named :file:`venv`.
|
||||||
|
|
||||||
You can also use the Python interpreter of your choice (like
|
You can also use the Python interpreter of your choice (like
|
||||||
``python2.7``).
|
``python2.7``).
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ virtualenv -p /usr/bin/python2.7 my_project
|
$ virtualenv -p /usr/bin/python2.7 venv
|
||||||
|
|
||||||
or change the interpreter globally with an env variable in ``~/.bashrc``:
|
or change the interpreter globally with an env variable in ``~/.bashrc``:
|
||||||
|
|
||||||
@@ -254,12 +257,20 @@ or change the interpreter globally with an env variable in ``~/.bashrc``:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ source my_project/bin/activate
|
$ source venv/bin/activate
|
||||||
|
|
||||||
The name of the current virtual environment will now appear on the left of
|
The name of the current virtual environment will now appear on the left of
|
||||||
the prompt (e.g. ``(my_project)Your-Computer:your_project UserName$)`` to let you know
|
the prompt (e.g. ``(venv)Your-Computer:your_project UserName$)`` to let you know
|
||||||
that it's active. From now on, any package that you install using pip will be
|
that it's active. From now on, any package that you install using pip will be
|
||||||
placed in the ``my_project`` folder, isolated from the global Python installation.
|
placed in the ``venv`` folder, isolated from the global Python installation.
|
||||||
|
|
||||||
|
For Windows, same command which is mentioned in step 1 can be used for creation of virtual environment. But, to activate, we use the following command.
|
||||||
|
|
||||||
|
Assuming that you are in project directory:
|
||||||
|
|
||||||
|
.. code-block:: powershell
|
||||||
|
|
||||||
|
PS C:\Users\suryav> \venv\Scripts\activate
|
||||||
|
|
||||||
Install packages as usual, for example:
|
Install packages as usual, for example:
|
||||||
|
|
||||||
@@ -281,9 +292,12 @@ To delete a virtual environment, just delete its folder. (In this case,
|
|||||||
it would be ``rm -rf my_project``.)
|
it would be ``rm -rf my_project``.)
|
||||||
|
|
||||||
After a while, though, you might end up with a lot of virtual environments
|
After a while, though, you might end up with a lot of virtual environments
|
||||||
littered across your system, and its possible you'll forget their names or
|
littered across your system, and it's possible you'll forget their names or
|
||||||
where they were placed.
|
where they were placed.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Python has included venv module from version 3.3. For more details: `venv <https://docs.python.org/3/library/venv.html>`_.
|
||||||
|
|
||||||
Other Notes
|
Other Notes
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -293,7 +307,7 @@ for keeping the package list clean in case it needs to be accessed later.
|
|||||||
[This is the default behavior for ``virtualenv`` 1.7 and later.]
|
[This is the default behavior for ``virtualenv`` 1.7 and later.]
|
||||||
|
|
||||||
In order to keep your environment consistent, it's a good idea to "freeze"
|
In order to keep your environment consistent, it's a good idea to "freeze"
|
||||||
the current state of the environment packages. To do this, run
|
the current state of the environment packages. To do this, run:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -302,7 +316,7 @@ the current state of the environment packages. To do this, run
|
|||||||
This will create a :file:`requirements.txt` file, which contains a simple
|
This will create a :file:`requirements.txt` file, which contains a simple
|
||||||
list of all the packages in the current environment, and their respective
|
list of all the packages in the current environment, and their respective
|
||||||
versions. You can see the list of installed packages without the requirements
|
versions. You can see the list of installed packages without the requirements
|
||||||
format using "pip list". Later it will be easier for a different developer
|
format using ``pip list``. Later it will be easier for a different developer
|
||||||
(or you, if you need to re-create the environment) to install the same packages
|
(or you, if you need to re-create the environment) to install the same packages
|
||||||
using the same versions:
|
using the same versions:
|
||||||
|
|
||||||
@@ -343,7 +357,7 @@ To install (make sure **virtualenv** is already installed):
|
|||||||
|
|
||||||
$ pip install virtualenvwrapper-win
|
$ pip install virtualenvwrapper-win
|
||||||
|
|
||||||
In Windows, the default path for WORKON_HOME is %USERPROFILE%\Envs
|
In Windows, the default path for WORKON_HOME is %USERPROFILE%\\Envs
|
||||||
|
|
||||||
Basic Usage
|
Basic Usage
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
@@ -363,7 +377,7 @@ This creates the :file:`my_project` folder inside :file:`~/Envs`.
|
|||||||
$ workon my_project
|
$ workon my_project
|
||||||
|
|
||||||
Alternatively, you can make a project, which creates the virtual environment,
|
Alternatively, you can make a project, which creates the virtual environment,
|
||||||
and also a project directory inside ``$WORKON_HOME``, which is ``cd`` -ed into
|
and also a project directory inside ``$WORKON_HOME``, which is ``cd``-ed into
|
||||||
when you ``workon myproject``.
|
when you ``workon myproject``.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ For installing the full stack, or individual packages, you can refer to the inst
|
|||||||
scikit-learn
|
scikit-learn
|
||||||
************
|
************
|
||||||
|
|
||||||
Scikit is a free and open-source machine learning library for Python. It offers off-the-shelf functions to implement many algorithms like linear regression, classifiers, SVMs, k-means, Neural Networks etc. It also has a few sample datasets which can be directly used for training and testing.
|
Scikit is a free and open source machine learning library for Python. It offers off-the-shelf functions to implement many algorithms like linear regression, classifiers, SVMs, k-means, Neural Networks etc. It also has a few sample datasets which can be directly used for training and testing.
|
||||||
|
|
||||||
Because of its speed, robustness and easiness to use, it's one of the most widely-used libraries for many Machine Learning applications.
|
Because of its speed, robustness and easiness to use, it's one of the most widely-used libraries for many Machine Learning applications.
|
||||||
|
|
||||||
|
|||||||
@@ -140,11 +140,10 @@ out.
|
|||||||
Anaconda
|
Anaconda
|
||||||
--------
|
--------
|
||||||
|
|
||||||
`Continuum Analytics <http://continuum.io/>`_ offers the `Anaconda
|
The `Anaconda Python Distribution <https://www.anaconda.com/>`_
|
||||||
Python Distribution <https://store.continuum.io/cshop/anaconda>`_ which
|
|
||||||
includes all the common scientific Python packages as well as many packages
|
includes all the common scientific Python packages as well as many packages
|
||||||
related to data analytics and big data. Anaconda itself is free, and
|
related to data analytics and big data. Anaconda itself is free, and a number
|
||||||
Continuum sells a number of proprietary add-ons. Free licenses for the
|
of proprietary add-ons are available for a fee. Free licenses for the
|
||||||
add-ons are available for academics and researchers.
|
add-ons are available for academics and researchers.
|
||||||
|
|
||||||
Canopy
|
Canopy
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ package.
|
|||||||
commandline tools by running ``xcode-select --install`` on the terminal.
|
commandline tools by running ``xcode-select --install`` on the terminal.
|
||||||
|
|
||||||
|
|
||||||
While OS X comes with a large number of UNIX utilities, those familiar with
|
While OS X comes with a large number of Unix utilities, those familiar with
|
||||||
Linux systems will notice one key component missing: a decent package manager.
|
Linux systems will notice one key component missing: a decent package manager.
|
||||||
`Homebrew <http://brew.sh>`_ fills this void.
|
`Homebrew <http://brew.sh>`_ fills this void.
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ package.
|
|||||||
If you perform a fresh install of Xcode, you will also need to add the
|
If you perform a fresh install of Xcode, you will also need to add the
|
||||||
commandline tools by running ``xcode-select --install`` on the terminal.
|
commandline tools by running ``xcode-select --install`` on the terminal.
|
||||||
|
|
||||||
While OS X comes with a large number of UNIX utilities, those familiar with
|
While OS X comes with a large number of Unix utilities, those familiar with
|
||||||
Linux systems will notice one key component missing: a package manager.
|
Linux systems will notice one key component missing: a package manager.
|
||||||
`Homebrew <http://brew.sh>`_ fills this void.
|
`Homebrew <http://brew.sh>`_ fills this void.
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ written in C. It compiles Python code to intermediate bytecode which is then
|
|||||||
interpreted by a virtual machine. CPython provides the highest
|
interpreted by a virtual machine. CPython provides the highest
|
||||||
level of compatibility with Python packages and C extension modules.
|
level of compatibility with Python packages and C extension modules.
|
||||||
|
|
||||||
If you are writing open-source Python code and want to reach the widest possible
|
If you are writing open source Python code and want to reach the widest possible
|
||||||
audience, targeting CPython is best. To use packages which rely on C extensions
|
audience, targeting CPython is best. To use packages which rely on C extensions
|
||||||
to function, CPython is your only implementation option.
|
to function, CPython is your only implementation option.
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ information. This file is the main entry point for readers of the code.
|
|||||||
|
|
||||||
An :file:`INSTALL` file is less necessary with Python. The installation
|
An :file:`INSTALL` file is less necessary with Python. The installation
|
||||||
instructions are often reduced to one command, such as ``pip install
|
instructions are often reduced to one command, such as ``pip install
|
||||||
module`` or ``python setup.py install`` and added to the :file:`README`
|
module`` or ``python setup.py install``, and added to the :file:`README`
|
||||||
file.
|
file.
|
||||||
|
|
||||||
A :file:`LICENSE` file should *always* be present and specify the license
|
A :file:`LICENSE` file should *always* be present and specify the license
|
||||||
@@ -75,7 +75,7 @@ your source repository so that rebuilding your documentation will
|
|||||||
happen automatically.
|
happen automatically.
|
||||||
|
|
||||||
When run, Sphinx_ will import your code and using Python's introspection
|
When run, Sphinx_ will import your code and using Python's introspection
|
||||||
features it will extract all function, method and class signatures. It will
|
features it will extract all function, method, and class signatures. It will
|
||||||
also extract the accompanying docstrings, and compile it all into well
|
also extract the accompanying docstrings, and compile it all into well
|
||||||
structured and easily readable documentation for your project.
|
structured and easily readable documentation for your project.
|
||||||
|
|
||||||
@@ -215,7 +215,7 @@ more information about a function, what it does, any exceptions it may raise,
|
|||||||
what it returns, or relevant details about the parameters.
|
what it returns, or relevant details about the parameters.
|
||||||
|
|
||||||
For more detailed documentation of code a popular style is the one used for the
|
For more detailed documentation of code a popular style is the one used for the
|
||||||
Numpy project, often called `Numpy style`_ docstrings. While it can take up more
|
NumPy project, often called `NumPy style`_ docstrings. While it can take up more
|
||||||
lines than the previous example, it allows the developer to include a lot
|
lines than the previous example, it allows the developer to include a lot
|
||||||
more information about a method, function, or class. ::
|
more information about a method, function, or class. ::
|
||||||
|
|
||||||
@@ -245,8 +245,8 @@ docstrings, making it easy to incorporate NumPy style docstrings into your
|
|||||||
project.
|
project.
|
||||||
|
|
||||||
At the end of the day, it doesn't really matter what style is used for writing
|
At the end of the day, it doesn't really matter what style is used for writing
|
||||||
docstrings, their purpose is to serve as documentation for anyone who may need
|
docstrings; their purpose is to serve as documentation for anyone who may need
|
||||||
to read or make changes to your code. As long as it is correct, understandable
|
to read or make changes to your code. As long as it is correct, understandable,
|
||||||
and gets the relevant points across then it has done the job it was designed to
|
and gets the relevant points across then it has done the job it was designed to
|
||||||
do.
|
do.
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ will automatically write a bytecode version of that file to disk, e.g.
|
|||||||
|
|
||||||
These ``.pyc`` files should not be checked into your source code repositories.
|
These ``.pyc`` files should not be checked into your source code repositories.
|
||||||
|
|
||||||
Theoretically, this behavior is on by default, for performance reasons.
|
Theoretically, this behavior is on by default for performance reasons.
|
||||||
Without these bytecode files present, Python would re-generate the bytecode
|
Without these bytecode files present, Python would re-generate the bytecode
|
||||||
every time the file is loaded.
|
every time the file is loaded.
|
||||||
|
|
||||||
|
|||||||
@@ -19,18 +19,18 @@ In general, these licenses tend to fall into one of two categories:
|
|||||||
|
|
||||||
1. licenses that focus more on the user's freedom to do with the
|
1. licenses that focus more on the user's freedom to do with the
|
||||||
software as they please (these are the more permissive open
|
software as they please (these are the more permissive open
|
||||||
source licenses such as the MIT, BSD, & Apache).
|
source licenses such as the MIT, BSD, and Apache)
|
||||||
|
|
||||||
2. licenses that focus more on making sure that the code itself —
|
2. licenses that focus more on making sure that the code itself —
|
||||||
including any changes made to it and distributed along with it —
|
including any changes made to it and distributed along with it —
|
||||||
always remains free (these are the less permissive free software
|
always remains free (these are the less permissive free software
|
||||||
licenses such as the GPL and LGPL).
|
licenses such as the GPL and LGPL)
|
||||||
|
|
||||||
The latter are less permissive in the sense that they don't permit
|
The latter are less permissive in the sense that they don't permit
|
||||||
someone to add code to the software and distribute it without also
|
someone to add code to the software and distribute it without also
|
||||||
including the source code for their changes.
|
including the source code for their changes.
|
||||||
|
|
||||||
To help you choose one for your project, there's a `license chooser <http://choosealicense.com/>`_,
|
To help you choose one for your project, there's a `license chooser <http://choosealicense.com/>`_;
|
||||||
**use it**.
|
**use it**.
|
||||||
|
|
||||||
**More Permissive**
|
**More Permissive**
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ hierarchy of loggers using dot notation, so using ``__name__`` ensures
|
|||||||
no name collisions.
|
no name collisions.
|
||||||
|
|
||||||
Here is an example of best practice from the `requests source`_ -- place
|
Here is an example of best practice from the `requests source`_ -- place
|
||||||
this in your ``__init__.py``
|
this in your ``__init__.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ There are at least three ways to configure a logger:
|
|||||||
- Using an INI-formatted file:
|
- Using an INI-formatted file:
|
||||||
- **Pro**: possible to update configuration while running using the
|
- **Pro**: possible to update configuration while running using the
|
||||||
function :func:`logging.config.listen` to listen on a socket.
|
function :func:`logging.config.listen` to listen on a socket.
|
||||||
- **Con**: less control (*e.g.* custom subclassed filters or loggers)
|
- **Con**: less control (e.g. custom subclassed filters or loggers)
|
||||||
than possible when configuring a logger in code.
|
than possible when configuring a logger in code.
|
||||||
- Using a dictionary or a JSON-formatted file:
|
- Using a dictionary or a JSON-formatted file:
|
||||||
- **Pro**: in addition to updating while running, it is possible to load
|
- **Pro**: in addition to updating while running, it is possible to load
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ reading. Each one of these projects is a paragon of Python coding.
|
|||||||
best intentions in mind.
|
best intentions in mind.
|
||||||
|
|
||||||
- `Diamond <https://github.com/python-diamond/Diamond>`_
|
- `Diamond <https://github.com/python-diamond/Diamond>`_
|
||||||
Diamond is a python daemon that collects metrics
|
Diamond is a Python daemon that collects metrics
|
||||||
and publishes them to Graphite or other backends.
|
and publishes them to Graphite or other backends.
|
||||||
It is capable of collecting CPU, memory, network, I/O, load, and disk metrics.
|
It is capable of collecting CPU, memory, network, I/O, load, and disk metrics.
|
||||||
Additionally, it features an API for implementing custom collectors
|
Additionally, it features an API for implementing custom collectors
|
||||||
@@ -36,7 +36,7 @@ reading. Each one of these projects is a paragon of Python coding.
|
|||||||
applications and has become one of the most advanced WSGI utility modules.
|
applications and has become one of the most advanced WSGI utility modules.
|
||||||
It includes a powerful debugger, full-featured request and response objects,
|
It includes a powerful debugger, full-featured request and response objects,
|
||||||
HTTP utilities to handle entity tags, cache control headers, HTTP dates,
|
HTTP utilities to handle entity tags, cache control headers, HTTP dates,
|
||||||
cookie handling, file uploads, a powerful URL routing system and a bunch
|
cookie handling, file uploads, a powerful URL routing system, and a bunch
|
||||||
of community-contributed addon modules.
|
of community-contributed addon modules.
|
||||||
|
|
||||||
- `Requests <https://github.com/kennethreitz/requests>`_
|
- `Requests <https://github.com/kennethreitz/requests>`_
|
||||||
@@ -49,4 +49,4 @@ reading. Each one of these projects is a paragon of Python coding.
|
|||||||
|
|
||||||
.. todo:: Include code examples of exemplary code from each of the projects listed. Explain why it is excellent code. Use complex examples.
|
.. todo:: Include code examples of exemplary code from each of the projects listed. Explain why it is excellent code. Use complex examples.
|
||||||
|
|
||||||
.. todo:: Explain techniques to rapidly identify data structures, algorithms and determine what the code is doing.
|
.. todo:: Explain techniques to rapidly identify data structures and algorithms and determine what the code is doing.
|
||||||
|
|||||||
+12
-12
@@ -211,7 +211,7 @@ I highly recommend the latter. Requiring a developer to run
|
|||||||
codebase also requires them to have an isolated environment setup for
|
codebase also requires them to have an isolated environment setup for
|
||||||
each instance of the codebase.
|
each instance of the codebase.
|
||||||
|
|
||||||
To give the individual tests import context, create a tests/context.py
|
To give the individual tests import context, create a ``tests/context.py``
|
||||||
file:
|
file:
|
||||||
|
|
||||||
::
|
::
|
||||||
@@ -247,8 +247,8 @@ Makefile
|
|||||||
|
|
||||||
|
|
||||||
If you look at most of my projects or any Pocoo project, you'll notice a
|
If you look at most of my projects or any Pocoo project, you'll notice a
|
||||||
Makefile laying around. Why? These projects aren't written in C... In
|
Makefile lying around. Why? These projects aren't written in C... In
|
||||||
short, make is a incredibly useful tool for defining generic tasks for
|
short, make is an incredibly useful tool for defining generic tasks for
|
||||||
your project.
|
your project.
|
||||||
|
|
||||||
**Sample Makefile:**
|
**Sample Makefile:**
|
||||||
@@ -334,7 +334,7 @@ include:
|
|||||||
- Multiple and messy circular dependencies: if your classes
|
- Multiple and messy circular dependencies: if your classes
|
||||||
Table and Chair in :file:`furn.py` need to import Carpenter from
|
Table and Chair in :file:`furn.py` need to import Carpenter from
|
||||||
:file:`workers.py` to answer a question such as ``table.isdoneby()``,
|
:file:`workers.py` to answer a question such as ``table.isdoneby()``,
|
||||||
and if conversely the class Carpenter needs to import Table and Chair,
|
and if conversely the class Carpenter needs to import Table and Chair
|
||||||
to answer the question ``carpenter.whatdo()``, then you
|
to answer the question ``carpenter.whatdo()``, then you
|
||||||
have a circular dependency. In this case you will have to resort to
|
have a circular dependency. In this case you will have to resort to
|
||||||
fragile hacks such as using import statements inside
|
fragile hacks such as using import statements inside
|
||||||
@@ -402,7 +402,7 @@ If you'd like you could name your module :file:`my_spam.py`, but even our
|
|||||||
friend the underscore should not be seen often in module names. However, using other
|
friend the underscore should not be seen often in module names. However, using other
|
||||||
characters (spaces or hyphens) in module names will prevent importing
|
characters (spaces or hyphens) in module names will prevent importing
|
||||||
(- is the subtract operator), so try to keep module names short so there is
|
(- is the subtract operator), so try to keep module names short so there is
|
||||||
no need to separate words. And, most of all, don't namespace with underscores, use submodules instead.
|
no need to separate words. And, most of all, don't namespace with underscores; use submodules instead.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@@ -473,7 +473,7 @@ typing.
|
|||||||
|
|
||||||
As mentioned in the :ref:`code_style` section, readability is one of the main
|
As mentioned in the :ref:`code_style` section, readability is one of the main
|
||||||
features of Python. Readability means to avoid useless boilerplate text and
|
features of Python. Readability means to avoid useless boilerplate text and
|
||||||
clutter, therefore some efforts are spent trying to achieve a certain level of
|
clutter; therefore some efforts are spent trying to achieve a certain level of
|
||||||
brevity. But terseness and obscurity are the limits where brevity should stop.
|
brevity. But terseness and obscurity are the limits where brevity should stop.
|
||||||
Being able to tell immediately where a class or function comes from, as in the
|
Being able to tell immediately where a class or function comes from, as in the
|
||||||
``modu.func`` idiom, greatly improves code readability and understandability in
|
``modu.func`` idiom, greatly improves code readability and understandability in
|
||||||
@@ -494,7 +494,7 @@ used to gather all package-wide definitions.
|
|||||||
|
|
||||||
A file :file:`modu.py` in the directory :file:`pack/` is imported with the
|
A file :file:`modu.py` in the directory :file:`pack/` is imported with the
|
||||||
statement ``import pack.modu``. This statement will look for an
|
statement ``import pack.modu``. This statement will look for an
|
||||||
:file:`__init__.py` file in :file:`pack`, execute all of its top-level
|
:file:`__init__.py` file in :file:`pack` and execute all of its top-level
|
||||||
statements. Then it will look for a file named :file:`pack/modu.py` and
|
statements. Then it will look for a file named :file:`pack/modu.py` and
|
||||||
execute all of its top-level statements. After these operations, any variable,
|
execute all of its top-level statements. After these operations, any variable,
|
||||||
function, or class defined in :file:`modu.py` is available in the pack.modu
|
function, or class defined in :file:`modu.py` is available in the pack.modu
|
||||||
@@ -549,9 +549,9 @@ programming, comes from the "state" part of the equation.
|
|||||||
|
|
||||||
In some architectures, typically web applications, multiple instances of Python
|
In some architectures, typically web applications, multiple instances of Python
|
||||||
processes are spawned to respond to external requests that can happen at the
|
processes are spawned to respond to external requests that can happen at the
|
||||||
same time. In this case, holding some state into instantiated objects, which
|
same time. In this case, holding some state in instantiated objects, which
|
||||||
means keeping some static information about the world, is prone to concurrency
|
means keeping some static information about the world, is prone to concurrency
|
||||||
problems or race-conditions. Sometimes, between the initialization of the state
|
problems or race conditions. Sometimes, between the initialization of the state
|
||||||
of an object (usually done with the ``__init__()`` method) and the actual use
|
of an object (usually done with the ``__init__()`` method) and the actual use
|
||||||
of the object state through one of its methods, the world may have changed, and
|
of the object state through one of its methods, the world may have changed, and
|
||||||
the retained state may be outdated. For example, a request may load an item in
|
the retained state may be outdated. For example, a request may load an item in
|
||||||
@@ -580,7 +580,7 @@ logic (called pure functions) allow the following benefits:
|
|||||||
- Pure functions are much easier to change or replace if they need to
|
- Pure functions are much easier to change or replace if they need to
|
||||||
be refactored or optimized.
|
be refactored or optimized.
|
||||||
|
|
||||||
- Pure functions are easier to test with unit-tests: There is less
|
- Pure functions are easier to test with unit tests: There is less
|
||||||
need for complex context setup and data cleaning afterwards.
|
need for complex context setup and data cleaning afterwards.
|
||||||
|
|
||||||
- Pure functions are easier to manipulate, decorate, and pass around.
|
- Pure functions are easier to manipulate, decorate, and pass around.
|
||||||
@@ -622,7 +622,7 @@ clearer and thus preferred.
|
|||||||
# bar() is decorated
|
# bar() is decorated
|
||||||
|
|
||||||
This mechanism is useful for separating concerns and avoiding
|
This mechanism is useful for separating concerns and avoiding
|
||||||
external un-related logic 'polluting' the core logic of the function
|
external unrelated logic 'polluting' the core logic of the function
|
||||||
or method. A good example of a piece of functionality that is better handled
|
or method. A good example of a piece of functionality that is better handled
|
||||||
with decoration is `memoization <https://en.wikipedia.org/wiki/Memoization#Overview>`__ or caching: you want to store the results of an
|
with decoration is `memoization <https://en.wikipedia.org/wiki/Memoization#Overview>`__ or caching: you want to store the results of an
|
||||||
expensive function in a table and use them directly instead of recomputing
|
expensive function in a table and use them directly instead of recomputing
|
||||||
@@ -874,7 +874,7 @@ like above or in cases where you are adding to an existing string, using
|
|||||||
.. note::
|
.. note::
|
||||||
You can also use the :ref:`% <python:string-formatting>` formatting operator
|
You can also use the :ref:`% <python:string-formatting>` formatting operator
|
||||||
to concatenate a pre-determined number of strings besides :py:meth:`str.join`
|
to concatenate a pre-determined number of strings besides :py:meth:`str.join`
|
||||||
and ``+``. However, :pep:`3101`, discourages the usage of the ``%`` operator
|
and ``+``. However, :pep:`3101` discourages the usage of the ``%`` operator
|
||||||
in favor of the :py:meth:`str.format` method.
|
in favor of the :py:meth:`str.format` method.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|||||||
+23
-23
@@ -115,7 +115,7 @@ compared to the more straightforward calls to ``send('Hello', 'World')`` and
|
|||||||
optional, and evaluate to ``None`` when they are not passed another value.
|
optional, and evaluate to ``None`` when they are not passed another value.
|
||||||
|
|
||||||
Calling a function with keyword arguments can be done in multiple ways in
|
Calling a function with keyword arguments can be done in multiple ways in
|
||||||
Python, for example it is possible to follow the order of arguments in the
|
Python; for example, it is possible to follow the order of arguments in the
|
||||||
definition without explicitly naming the arguments, like in
|
definition without explicitly naming the arguments, like in
|
||||||
``send('Hello', 'World', 'Cthulhu', 'God')``, sending a blind carbon copy to
|
``send('Hello', 'World', 'Cthulhu', 'God')``, sending a blind carbon copy to
|
||||||
God. It would also be possible to name arguments in another order, like in
|
God. It would also be possible to name arguments in another order, like in
|
||||||
@@ -124,7 +124,7 @@ possibilities are better avoided without any strong reason to not follow the
|
|||||||
syntax that is the closest to the function definition:
|
syntax that is the closest to the function definition:
|
||||||
``send('Hello', 'World', cc='Cthulhu', bcc='God')``.
|
``send('Hello', 'World', cc='Cthulhu', bcc='God')``.
|
||||||
|
|
||||||
As a side note, following `YAGNI <http://en.wikipedia.org/wiki/You_ain't_gonna_need_it>`_
|
As a side note, following the `YAGNI <http://en.wikipedia.org/wiki/You_ain't_gonna_need_it>`_
|
||||||
principle, it is often harder to remove an optional argument (and its logic
|
principle, it is often harder to remove an optional argument (and its logic
|
||||||
inside the function) that was added "just in case" and is seemingly never used,
|
inside the function) that was added "just in case" and is seemingly never used,
|
||||||
than to add a new optional argument and its logic when needed.
|
than to add a new optional argument and its logic when needed.
|
||||||
@@ -134,7 +134,7 @@ than to add a new optional argument and its logic when needed.
|
|||||||
an extensible number of positional arguments, it can be defined with the
|
an extensible number of positional arguments, it can be defined with the
|
||||||
``*args`` constructs. In the function body, ``args`` will be a tuple of all
|
``*args`` constructs. In the function body, ``args`` will be a tuple of all
|
||||||
the remaining positional arguments. For example, ``send(message, *args)``
|
the remaining positional arguments. For example, ``send(message, *args)``
|
||||||
can be called with each recipient as an argument:``send('Hello', 'God',
|
can be called with each recipient as an argument: ``send('Hello', 'God',
|
||||||
'Mom', 'Cthulhu')``, and in the function body ``args`` will be equal to
|
'Mom', 'Cthulhu')``, and in the function body ``args`` will be equal to
|
||||||
``('God', 'Mom', 'Cthulhu')``.
|
``('God', 'Mom', 'Cthulhu')``.
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ possible to do each of the following:
|
|||||||
|
|
||||||
* change how the Python interpreter imports modules
|
* change how the Python interpreter imports modules
|
||||||
|
|
||||||
* it is even possible (and recommended if needed) to embed C routines in Python.
|
* It is even possible (and recommended if needed) to embed C routines in Python.
|
||||||
|
|
||||||
However, all these options have many drawbacks and it is always better to use
|
However, all these options have many drawbacks and it is always better to use
|
||||||
the most straightforward way to achieve your goal. The main drawback is that
|
the most straightforward way to achieve your goal. The main drawback is that
|
||||||
@@ -208,7 +208,7 @@ are all responsible users".
|
|||||||
|
|
||||||
This doesn't mean that, for example, no properties are considered private, and
|
This doesn't mean that, for example, no properties are considered private, and
|
||||||
that no proper encapsulation is possible in Python. Rather, instead of relying
|
that no proper encapsulation is possible in Python. Rather, instead of relying
|
||||||
on concrete walls erected by the developers between their code and other's, the
|
on concrete walls erected by the developers between their code and others', the
|
||||||
Python community prefers to rely on a set of conventions indicating that these
|
Python community prefers to rely on a set of conventions indicating that these
|
||||||
elements should not be accessed directly.
|
elements should not be accessed directly.
|
||||||
|
|
||||||
@@ -359,7 +359,7 @@ Instead, use a list comprehension:
|
|||||||
|
|
||||||
four_lists = [[] for __ in xrange(4)]
|
four_lists = [[] for __ in xrange(4)]
|
||||||
|
|
||||||
Note: Use range() instead of xrange() in Python 3
|
Note: Use range() instead of xrange() in Python 3.
|
||||||
|
|
||||||
Create a string from a list
|
Create a string from a list
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -462,7 +462,7 @@ group <http://artifex.org/~hblanks/talks/2011/pep20_by_example.pdf>`_.
|
|||||||
PEP 8
|
PEP 8
|
||||||
*****
|
*****
|
||||||
|
|
||||||
:pep:`8` is the de-facto code style guide for Python. A high quality,
|
:pep:`8` is the de facto code style guide for Python. A high quality,
|
||||||
easy-to-read version of PEP 8 is also available at `pep8.org <http://pep8.org/>`_.
|
easy-to-read version of PEP 8 is also available at `pep8.org <http://pep8.org/>`_.
|
||||||
|
|
||||||
This is highly recommended reading. The entire Python community does their
|
This is highly recommended reading. The entire Python community does their
|
||||||
@@ -520,10 +520,10 @@ Conventions
|
|||||||
|
|
||||||
Here are some conventions you should follow to make your code easier to read.
|
Here are some conventions you should follow to make your code easier to read.
|
||||||
|
|
||||||
Check if variable equals a constant
|
Check if a variable equals a constant
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
You don't need to explicitly compare a value to True, or None, or 0 - you can
|
You don't need to explicitly compare a value to True, or None, or 0 -- you can
|
||||||
just add it to the if statement. See `Truth Value Testing
|
just add it to the if statement. See `Truth Value Testing
|
||||||
<http://docs.python.org/library/stdtypes.html#truth-value-testing>`_ for a
|
<http://docs.python.org/library/stdtypes.html#truth-value-testing>`_ for a
|
||||||
list of what is considered false.
|
list of what is considered false.
|
||||||
@@ -608,7 +608,7 @@ Never remove items from a list while you are iterating through it.
|
|||||||
a.remove(i)
|
a.remove(i)
|
||||||
|
|
||||||
Don't make multiple passes through the list.
|
Don't make multiple passes through the list.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
while i in a:
|
while i in a:
|
||||||
@@ -617,7 +617,7 @@ Don't make multiple passes through the list.
|
|||||||
**Good**:
|
**Good**:
|
||||||
|
|
||||||
Python has a few standard ways of filtering lists.
|
Python has a few standard ways of filtering lists.
|
||||||
The approach you use depends on
|
The approach you use depends on:
|
||||||
|
|
||||||
* Python 2.x vs. 3.x
|
* Python 2.x vs. 3.x
|
||||||
* Lists vs. iterators
|
* Lists vs. iterators
|
||||||
@@ -626,19 +626,19 @@ The approach you use depends on
|
|||||||
Python 2.x vs. 3.x
|
Python 2.x vs. 3.x
|
||||||
::::::::::::::::::
|
::::::::::::::::::
|
||||||
|
|
||||||
Starting with Python 3.0, the :py:func:`filter` function returns an iterator instead of a list.
|
Starting with Python 3.0, the :py:func:`filter` function returns an iterator instead of a list.
|
||||||
Wrap it in :py:func:`list` if you truly need a list.
|
Wrap it in :py:func:`list` if you truly need a list.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
list(filter(...))
|
list(filter(...))
|
||||||
|
|
||||||
List comprehensions and generator expressions work the same in both 2.x and 3.x (except that comprehensions in 2.x "leak" variables into the enclosing namespace)
|
List comprehensions and generator expressions work the same in both 2.x and 3.x (except that comprehensions in 2.x "leak" variables into the enclosing namespace):
|
||||||
|
|
||||||
* comprehensions create a new list object
|
* Comprehensions create a new list object.
|
||||||
* generators iterate over the original list
|
* Generators iterate over the original list.
|
||||||
|
|
||||||
The :py:func:`filter` function
|
The :py:func:`filter` function:
|
||||||
|
|
||||||
* in 2.x returns a list (use itertools.ifilter if you want an iterator)
|
* in 2.x returns a list (use itertools.ifilter if you want an iterator)
|
||||||
* in 3.x returns an iterator
|
* in 3.x returns an iterator
|
||||||
@@ -653,14 +653,14 @@ Creating a new list requires more work and uses more memory. If you a just going
|
|||||||
# comprehensions create a new list object
|
# comprehensions create a new list object
|
||||||
filtered_values = [value for value in sequence if value != x]
|
filtered_values = [value for value in sequence if value != x]
|
||||||
# Or (2.x)
|
# Or (2.x)
|
||||||
filtered_values = filter(lambda i: i != x, sequence)
|
filtered_values = filter(lambda i: i != x, sequence)
|
||||||
|
|
||||||
# generators don't create another list
|
# generators don't create another list
|
||||||
filtered_values = (value for value in sequence if value != x)
|
filtered_values = (value for value in sequence if value != x)
|
||||||
# Or (3.x)
|
# Or (3.x)
|
||||||
filtered_values = filter(lambda i: i != x, sequence)
|
filtered_values = filter(lambda i: i != x, sequence)
|
||||||
# Or (2.x)
|
# Or (2.x)
|
||||||
filtered_values = itertools.ifilter(lambda i: i != x, sequence)
|
filtered_values = itertools.ifilter(lambda i: i != x, sequence)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -678,7 +678,7 @@ Modifying the original list can be risky if there are other variables referencin
|
|||||||
# Or
|
# Or
|
||||||
sequence[::] = filter(lambda value: value != x, sequence)
|
sequence[::] = filter(lambda value: value != x, sequence)
|
||||||
|
|
||||||
|
|
||||||
Modifying the values in a list
|
Modifying the values in a list
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
**Bad**:
|
**Bad**:
|
||||||
@@ -690,26 +690,26 @@ Remember that assignment never creates a new object. If two or more variables re
|
|||||||
# Add three to all list members.
|
# Add three to all list members.
|
||||||
a = [3, 4, 5]
|
a = [3, 4, 5]
|
||||||
b = a # a and b refer to the same list object
|
b = a # a and b refer to the same list object
|
||||||
|
|
||||||
for i in range(len(a)):
|
for i in range(len(a)):
|
||||||
a[i] += 3 # b[i] also changes
|
a[i] += 3 # b[i] also changes
|
||||||
|
|
||||||
**Good**:
|
**Good**:
|
||||||
|
|
||||||
It's safer to create a new list object and leave the original alone.
|
It's safer to create a new list object and leave the original alone.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
a = [3, 4, 5]
|
a = [3, 4, 5]
|
||||||
b = a
|
b = a
|
||||||
|
|
||||||
# assign the variable "a" to a new list without changing "b"
|
# assign the variable "a" to a new list without changing "b"
|
||||||
a = [i + 3 for i in a]
|
a = [i + 3 for i in a]
|
||||||
# Or (Python 2.x):
|
# Or (Python 2.x):
|
||||||
a = map(lambda i: i + 3, a)
|
a = map(lambda i: i + 3, a)
|
||||||
# Or (Python 3.x)
|
# Or (Python 3.x)
|
||||||
a = list(map(lambda i: i + 3, a))
|
a = list(map(lambda i: i + 3, a))
|
||||||
|
|
||||||
|
|
||||||
Use :py:func:`enumerate` keep a count of your place in the list.
|
Use :py:func:`enumerate` keep a count of your place in the list.
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ The Basics
|
|||||||
**********
|
**********
|
||||||
|
|
||||||
|
|
||||||
Unittest
|
unittest
|
||||||
--------
|
--------
|
||||||
|
|
||||||
:mod:`unittest` is the batteries-included test module in the Python standard
|
:mod:`unittest` is the batteries-included test module in the Python standard
|
||||||
@@ -170,7 +170,7 @@ functions:
|
|||||||
def test_answer():
|
def test_answer():
|
||||||
assert func(3) == 5
|
assert func(3) == 5
|
||||||
|
|
||||||
and then running the `py.test` command
|
and then running the `py.test` command:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -236,14 +236,14 @@ tox
|
|||||||
---
|
---
|
||||||
|
|
||||||
tox is a tool for automating test environment management and testing against
|
tox is a tool for automating test environment management and testing against
|
||||||
multiple interpreter configurations
|
multiple interpreter configurations.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ pip install tox
|
$ pip install tox
|
||||||
|
|
||||||
tox allows you to configure complicated multi-parameter test matrices via a
|
tox allows you to configure complicated multi-parameter test matrices via a
|
||||||
simple ini-style configuration file.
|
simple INI-style configuration file.
|
||||||
|
|
||||||
`tox <https://tox.readthedocs.io/en/latest/>`_
|
`tox <https://tox.readthedocs.io/en/latest/>`_
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ Unittest2
|
|||||||
unittest2 is a backport of Python 2.7's unittest module which has an improved
|
unittest2 is a backport of Python 2.7's unittest module which has an improved
|
||||||
API and better assertions over the one available in previous versions of Python.
|
API and better assertions over the one available in previous versions of Python.
|
||||||
|
|
||||||
If you're using Python 2.6 or below, you can install it with pip
|
If you're using Python 2.6 or below, you can install it with pip:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@@ -326,4 +326,3 @@ always returns the same result (but only for the duration of the test).
|
|||||||
Mock has many other ways you can configure it and control its behavior.
|
Mock has many other ways you can configure it and control its behavior.
|
||||||
|
|
||||||
`mock <http://www.voidspace.org.uk/python/mock/>`_
|
`mock <http://www.voidspace.org.uk/python/mock/>`_
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user