Moduly moduly aneb O importování

aliasy lze importovat jen jednu třídu/funkci/proměnnou, ale moduly mohou mit i více úrovní


In [1]:
from os import path
path.exists("data.csv")


Out[1]:
True

lze naimportovat jednotlive funkce


In [2]:
from os.path import exists

ale v jiném modulu má jiný význam


In [3]:
from sys import path
path[-5:]


Out[3]:
['/home/ziky/work/probe/probe-data-process2',
 '/home/ziky/work/probe/probe-plotting2',
 'VextFinder.PATH_TRIGGER',
 '/home/ziky/.virtualenvs/plasmasolve3/lib/python3.4/site-packages/IPython/extensions',
 '/home/ziky/.ipython']

lze přidat adresář k těm, ve kterých Python hledá importované moduly


In [4]:
path.append("/home/jovyan/work/")
path[-5:]


Out[4]:
['/home/ziky/work/probe/probe-plotting2',
 'VextFinder.PATH_TRIGGER',
 '/home/ziky/.virtualenvs/plasmasolve3/lib/python3.4/site-packages/IPython/extensions',
 '/home/ziky/.ipython',
 '/home/jovyan/work/']

ještě jeden příklad stejného jména, tady i se stejným významem - ale je to totéž?


In [5]:
from math import pi
import numpy as np
pi is np.pi, pi==np.pi


Out[5]:
(False, True)

poslední, ale nedoporučovaná specialita syntaxe
from xy import *
pozor na "jmenné znečistění" (nevíme, co všechno importujeme)

se značkou "*" nelze importovat uvnitř funkcí/tříd


In [6]:
## !! nedoporucovano
#from matplotlib.pyplot import *

In [7]:
## lepe takto
import numpy as np
import matplotlib.pyplot as pl

co nás ještě může zajímat (vše - jako třeba help a.k.a. docstring - je dostupné pro programové zpracování)


In [8]:
print(np.__version__, np.__file__)
print(np.__doc__[:1000]+"...")


1.11.2 /home/ziky/.virtualenvs/plasmasolve3/lib/python3.4/site-packages/numpy/__init__.py

NumPy
=====

Provides
  1. An array object of arbitrary homogeneous items
  2. Fast mathematical operations over arrays
  3. Linear Algebra, Fourier Transforms, Random Number Generation

How to use the documentation
----------------------------
Documentation is available in two forms: docstrings provided
with the code, and a loose standing reference guide, available from
`the NumPy homepage <http://www.scipy.org>`_.

We recommend exploring the docstrings using
`IPython <http://ipython.scipy.org>`_, an advanced Python shell with
TAB-completion and introspection capabilities.  See below for further
instructions.

The docstring examples assume that `numpy` has been imported as `np`::

  >>> import numpy as np

Code snippets are indicated by three greater-than signs::

  >>> x = 42
  >>> x = x + 1

Use the built-in ``help`` function to view a function's docstring::

  >>> help(np.sort)
  ... # doctest: +SKIP

For some objects, ``np.info(obj)`` may provide additional help.  This is
particu...

In [9]:
np?

In [10]:
print("modul np obsahuje %i pojmenovanych funkci/proměnných/podmodulů"%len(np.__all__))
np.__all__[10:20]


modul np obsahuje 604 pojmenovanych funkci/proměnných/podmodulů
Out[10]:
['newaxis',
 'ndarray',
 'flatiter',
 'nditer',
 'nested_iters',
 'ufunc',
 'arange',
 'array',
 'zeros',
 'count_nonzero']

... a teď vlastní modul? Jak prosté...

vše, co chcete (třídy pro řešení Fisherovy úlohy z pojednání o objektech), nakopírujete do souboru jako novy.py

import novy
    novy.Fisher("data.csv")

aktualizace

upravili jsme svůj kód, nebo nahráli novou verzi

from imp import reload

pro fajnšmekry ještě

  • hlubší úrovně nutne "reloadnout" ručně (nebo dreload aka "deep reload")
  • nutno znovu vytvořit objekty z dotčených tříd

In [11]:
from imp import reload
reload(np)


Out[11]:
<module 'numpy' from '/home/ziky/.virtualenvs/plasmasolve3/lib/python3.4/site-packages/numpy/__init__.py'>

ještě pár pojmů

packages

  • celé adresáře (jednotlivé soubory jsou podmoduly)
  • vložení (prázdného) __init__.py

jak použít program jako modul? před části kódu, která se nemá spustit při importu, přidáme řádek

.. if __name__=="__main__":


kde se hledají: PYTHONPATH nebo sys.path (lze přidávat za běhu)

hlavičky

  • spustitelný (v linuxu?)
    #!/usr/bin/python nebo
    #! /usr/bin/env python
  • charset (kódování)
    # -*- coding: utf-8 -*-
  • docstring (co všechno v modulu najdete)

cvičení zde

Level 1
  • vytvořit modul řešící Fišerův problém (soubor fisher.py)
  • naimportovat jej do nového notebooku
Level 2
  • vytvořit globální proměnnou v rámci modulu fontsize s hodnotou 25
  • na vhodných místech nahradit konstantu proměnnou
Level 3
  • příkazová řádka? příkazová řádka!

In [12]:
#nejak takto
%matplotlib inline
import fisher
fg=fisher.FisherGraph("data.csv")
fg.fit()
#fg.graph([0,30],"X","Y","Importovano")


[  0.62766786  70.21827857]