Está en la página 1de 9

9.1.

Mdulos
9.2. Paquetes

Tema 9
Mdulos y paquetes

9.1. Mdulos
En python, los programas que grabamos en disco como ficheros.py se llaman a
menudo scripts.

Al hacerse ms grandes, es buena idea dividir el cdigo en varios ficheros.


Podemos poner definiciones en un fichero de tal modo que sea usado por un
script.
Estos ficheros son denominados mdulos. Las
definiciones de un mdulo pueden ser importadas
en otros mdulos o en el mdulo principal.

Tema 9: mdulos y paquetes

2/9

Fichero fibo.py:

Sin salto de lnea

# Fibonacci numbers module


def fib(n):
# write Fibonacci series up to n
a, b = 0, 1
while b < n:
print("{0}, ".format(b),end="")
a, b = b, a+b
print()
def fib2(n):
# return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result

Fichero usa_fibo.py:
import fibo
fibo.fib(4)
lista = fibo.fib2(4)
print("Resultado: ",lista)

No hace nada!

$ python3 fibo.py
$ python3 usa_fibo.py
1, 1, 2, 3,
Resultado: [1, 1, 2, 3]

Tema 9: mdulos y paquetes

3/9

En un mdulo puede adems haber cdigo ejecutable, que se ejecuta cuando se


hace el import o cuando se usa como script.
Normalmente esto se usa para tareas de inicializacin.
Fichero fibo.py:
Importa el
mdulo fibo

# Fibonacci numbers module


def fib(n):
# write Fibonacci series up to n
a, b = 0, 1
while b < n:
print("{0}, ".format(b),end="")
a, b = b, a+b
print()
def fib2(n):
# return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result

>>>
>>>
>>>
[1,

Tema 9: mdulos y paquetes

>>> import fibo


>>> fibo.fib(100)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
>>> from fibo import *
>>> fib(100)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

Importa las definciones


del mdulo fibo al
mdulo principal

from fibo import fib2


l=fib2(700)
l
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

4/9

Usando mdulos como scripts


# Fibonacci numbers module
def fib(n):
# write Fibonacci series up to n
a, b = 0, 1
while b < n:
print("{0}, ".format(b),end="")
a, b = b, a+b
print()
def fib2(n):
# return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
if __name__ == "__main__":
import sys
print(fib2(int(sys.argv[1])))

Puedo usarlo como mdulo:


>>> import fibo
>>> fibo.fib(100)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
>>> from fibo import *
>>> fib(100)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

O como script:
$ python3 fibo.py 50
[1, 1, 2, 3, 5, 8, 13, 21, 34]

Tema 9: mdulos y paquetes

5/9

Funcin dir()
>>> import fibo,sys
>>> dir(fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__',
'__spec__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__',
'__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache',
'_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions',
'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names',
'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode',
'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval',
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile',
'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info',
'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode',
'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'ps2', 'set_coroutine_wrapper', 'setcheckinterval', 'setdlopenflags', 'setprofile',
'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info',
'version', 'version_info', 'warnoptions']
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'fibo', 'sys']

Tema 9: mdulos y paquetes

6/9

Docstring
# Fibonacci numbers module
def fib(n):
# write Fibonacci series up to n
""" Escribe por pantalla la serie de Fibonacci
hasta el nmero n
Argumentos:
n (int): nmero mximo a mostrar
"""
a, b = 0, 1
while b < n:
print("{0}, ".format(b),end="")
a, b = b, a+b
print()
def fib2(n):
# return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result

>>> import fibo


>>> dir(fibo)
['__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__',
'__package__', '__spec__', 'fib', 'fib2']
>>> help(fibo.fib)
Help on function fib in module fibo:
fib(n)
Escribe por pantalla la serie de
Fibonacci
hasta el nmero n
Argumentos:
n (int): nmero mximo a mostrar

if __name__ == "__main__":
import sys
print(fib2(int(sys.argv[1])))

Tema 9: mdulos y paquetes

7/9

Ejemplo: calculadora
mathcalc.py
def suma(a,b):
res = float(a)+float(b)
return res
def resta(a,b):
res = float(a)-float(b)
return res
def prod(a,b):
res = float(a)*float(b)
return res
def div(a,b):
res = float(a)/float(b)
return res

$ python3 calc.py 4 / 3
Resultado: 1.33
$ python3 calc.py 4 ^ 3
Operacin no permitida

calc.py

import mathcalc, config


from sys import argv, exit
if (len(argv)<4):
print(config.ayuda)
exit()
n1 = argv[1]
op = argv[2]
n2 = argv[3]
if op not in config.operaciones:
print("Operacin no permitida")
exit()

if op == "+":
result = mathcalc.suma(n1,n2)
print("Resultado: {0:.2f}".format(result))
elif op == "-":
result = mathcalc.resta(n1,n2)
print("Resultado: {0:.2f}".format(result))
elif op == "x":
result = mathcalc.prod(n1,n2)
print("Resultado: {0:.2f}".format(result))
elif op == "/":
result = mathcalc.div(n1,n2)
print("Resultado: {0:.2f}".format(result))
Operaciones = ("+","-","/","x")
ayuda = """
Calculadora simple
Uso: python calc.py n1 op n2
"""

config.py

Tema 9: mdulos y paquetes

8/9

9.2. Paquetes
Un paquete es un directorio que contiene mdulos python
Los paquetes pueden tener estructura jerrquica
casino/
__init__.py
craps/
__init__.py
dice.py

import casino.craps.game
import casino.strategy.basic as betting
from casino.blackjack import *

game.py
player.py
roulette/

Los dos primeros importan un mdulo

El ltimo importa todos los mdulos de un paquete y los


incorporan al espacio de nombres

__init__.py
wheel.py

__init__.py es necesario para poder definir un paquete

game.py

__init__.py contendr una lista __all__ que especifica qu


se importa con from import *

player.py
blackjack/

__init__.py puede contener cdigo que se ejecuta al

importar el paquete

__init__.py
Tema 9: mdulos y paquetes

cards.py

9/9