Novedades: actualmente estoy impulsando el proyecto Argentina en Python, desde aquí (ver mapa)

Características de Python 2.7-3.3 que no conocía

Python 2.7 es la última major release de la serie 2.x y esto es porque los desarrolladores de Python están avocados a las versiones de Python 3 más que a Python 2. Entonces, la idea es poner todo el esfuerzo en Python 3 y mantener una versión estable de Python 2, que esa sería la versión 2.7. Esta versión tuvo sus bug-fix releases hasta el 2012.

A continuación voy a mostrar las características nuevas más importantes (de uso común) desde Python 2.7 y hasta Python 3.3 que no conocía o no estoy habituado a usar. Además de las que muestre yo, han habido muchas más, incluso en cuestiones de performance.

Nota

En los casos en los que sea necesario, voy a hacer una diferencia marcada en los intérpretes de Python 2.7 y 3.3 si es que estos generan una salida diferente.

Python 2.7

  • Sintaxis para crear un set utilizando llaves ({}):

    # Python 2.7
    >>> {1,2,3}
    set([1, 2, 3])
    >>>
    
    # Python 3.3
    >>> {1,2,3}
    {1, 2, 3}
    >>> type({1,2,3})
    <class 'set'>
    >>>
    
  • Diccionarios y comprensión de listas:

    >>> {i: i*2 for i in range(3)}
    {0: 0, 1: 2, 2: 4}
    >>>
    
  • Multiples contextos en un solo with (with llama a __enter__() y __exit__() respectivamente):

    with A() as a, B() as b:
        suite
    
  • Diccionario ordenado:

    >>> from collections import OrderedDict
    >>> d = OrderedDict([('first', 1),
    ...                  ('second', 2),
    ...                  ('third', 3)])
    >>> d.items()
    [('first', 1), ('second', 2), ('third', 3)]
    
  • Marcador de miles, mediante ",", para números dentro de cadenas de caracteres:

    >>> '{:20,.2f}'.format(18446744073709551616.0)
    '18,446,744,073,709,551,616.00'
    
  • Nuevo módulo argparse que reemplaza a optparse debido a sus limitaciones. argoparse tiene mejores validaciones que optparse ya que permite, por ejemplo, espeficar el número de argumentos con un entero, 0 o más argumentos utilizando '*', 1 o más argumentos con '+' o un argumento opcional usando '?'. Además, se puede definir un tipo de argumento como FileType, el cual se va a abrir automáticamente.

  • Vistas de diccionarios. Los métodos de diccionario keys(), values() y items(), en Python 3.x devuelven un objeto llamado view en vez de una lista. Esta view es una representación de los valores del diccionario, por lo tanto si los valores del diccionario cambian, los valores de la view también (en Python 2.7, a esos nombres de métodos hay que anteponerle la palabra view:

    # Python 2.7
    >>> d = dict(a=1, b=2, c=3)
    >>> d
    {'b': 2, 'c': 3, 'a': 1}
    >>> view_keys = d.viewkeys()  # en Python 3 es solo keys()
    >>> view_keys
    dict_keys(['b', 'c', 'a'])
    >>> d['d'] = 4
    >>> view_keys
    dict_keys(['d', 'b', 'c', 'a'])
    >>>
    
  • El método str.format() soporta numeración automática del remplazo de campos. Hace que el uso de str.format() sea más parecido al uso del formateo con %s:

    >>> 'One: {}, Two: {}, Three: {}'.format(1, 2, 3)
    'One: 1, Two: 2, Three: 3'
    >>> 'One: {}, Two: {}, Three: {three}'.format(1, 2, three=3)
    'One: 1, Two: 2, Three: 3'
    
  • Nueva clase: collections.Counter. Es útil para el conteo de datos:

    >>> from collections import Counter
    >>> c = Counter()
    >>> for letter in 'here is a sample of english text':
    ...   c[letter] += 1
    ...
    >>> c
    Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
    'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
    'p': 1, 'r': 1, 'x': 1})
    >>> c['e']
    5
    >>> c['z']
    0
    
  • Algunas optimizaciones que hacen el funcionamiento de Python más rápido.

Python 3.0

  • print es una función:

    >>> print('The answer is', 2*2)
    The answer is 4
    >>>
    
  • División de punto flotante por omisión:

    >>> 3 / 2
    1.5
    >>> 3 // 2
    1
    >>>
    
  • Texto Vs. Datos

  • Desempaquetar iterables de forma variable:

    >>> (a, *rest, b) = range(5)
    >>> a
    0
    >>> rest
    [1, 2, 3]
    >>> b
    4
    >>>
    
  • Uso obligatorio de () en comprensión de listas:

    # Python 2.6
    >>> [x for x in 1, 2, 3]
    [1, 2, 3]
    >>>
    
    # Python 3.3.1
    >>> [x for x in 1, 2, 3]
    File "<stdin>", line 1
    [x for x in 1, 2, 3]
                 ^
    SyntaxError: invalid syntax
    
    # Esta es la nueva forma
    >>> [x for x in (1, 2, 3)]
    [1, 2, 3]
    >>>
    
  • Tuplas como parámetros, eliminadas:

    >>> def foo(a, (b, c)):
      File "<stdin>", line 1
        def foo(a, (b, c)):
                   ^
    SyntaxError: invalid syntax
    >>>
    
    # Esta es la nueva forma
    >>> def foo(a, b_c):
    ...   b, c = b_c
    ...   print(b, c)
    ...
    >>> foo(1, (2, 3))
    2 3
    >>>
    
  • raw_input() se renombró a input():

    >>> raw_input()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'raw_input' is not defined
    >>>
    
    >>> input()
    Hello, beautiful day!
    'Hello, beautiful day!'
    >>>
    

Python 3.2

  • Nuevo módulo: concurrent.futures. La idea es poder ejecutar varios hilos de manera concurrente sin tener que setear un entorno muy grande:

    import concurrent.futures, shutil
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
        e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
        e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
        e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
        e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
    
  • Los objetos range ahora soportan index(), count(), slicing y slicing negativo:

    >>> range(0, 100, 2).count(10)
    1
    >>> range(0, 100, 2).index(10)
    5
    >>> range(0, 100, 2)[5]
    10
    >>> range(0, 100, 2)[0:5]
    range(0, 10, 2)
    

Python 3.3

  • Entornos virtuales dentro de la librería estándar a través del módulo venv

    humitos@michifus:~$ python3 -m venv myvenv
    humitos@michifus:~$ ls myvenv/
    bin  include  lib  pyvenv.cfg
    humitos@michifus:~$ source myvenv/bin/activate
    (myvenv) humitos@michifus:~$ deactivate
    humitos@michifus:~$
    

Nota

Si sabés de alguna característica importante que me olvidé de mencionar, avisame a través de los comentarios así la agrego.

Seguramente de acá salga alguna que otra charlita.


Krishnamurti, mi maestro

Me gusta ver videos del viejo éste. Me parece que la tiene muy clara, habla claro y te hace reflexionar bastante sobre los hábitos, en general.

Hoy, "Libertad vs Autoridad"

¿Genera libertad la elección? ¿O dónde hay elección no hay libertad?

¿Puede haber una educación en la que no haya ninguna clase de autoridad?

http://www.youtube.com/watch?v=3ugwbz-OKAQ

Servidor de medios para SmartTv

En casa tengo un televisor Panasonic SmartTv Viera y tiene la opción de Viera Connect, que básicamente sirve para conectarse a internet utilizando alguna de las aplicaciones que trae instadas. Como ser, Netflix, YouTube, Vimeo, Skype y otras.

Lamentablemente, muchas de esas aplicaciones tildan el televisor cuando lo exigís mucho. Por ejemplo, entrar a un video, poner pausa, volver hacia atrás, resumir el video y... Finalmente, lo tenés que apagar y prender. Es malísimo el software que trae.

Sin embargo, hoy encontré una cosa muy útil y que por el momento está funcionando bastante bien aunque por ahí laggea un poco la red. La función que encontré hoy (que en realidad ya la conocía pero no sabía cómo se usaba) es Viera Connect - Servidor de archivos y sirve para reproducir archivos a través de la red. Por ejemplo, los que están en una computadora o en un SmartPhone.

Como yo SmartPhone no tengo, configuré mi Ubuntu 13.04 para que sirva los archivos que yo quiero mediante minidlna que utiliza DLNA/UPnP-AV para servir los archivos. Se puede escuchar música, ver videos y fotos.

Los pasos fueron bastante simples, pero tuve unos problemas con los permisos de archivos.

  1. Instalar minidlna

    sudo apt-get install minidlna
    
  2. Configurar qué archivos servir mediante la variable media_dir del archivo /etc/minidlna.conf

    sudo vim /etc/minidlna.conf
    
  3. Arreglar los problemas de permisos

    • utilizar /var/cache/minidlna para db_dir

    • ejecutar minidlna como tu usuario y grupo editando el archivo /etc/default/minidlna

    • detener el servidor

      sudo service minidlna stop
      
    • cambiar los permisos de la base de datos

      sudo chown -R humitos:humitos /var/cache/minidlna
      
    • escanear las carpetas compartidas

      minidlna -R
      
  4. Reiniciar el Servidor

    sudo service minidlna restart
    

La mayoría de la información la saqué de este post. Espero que sea útil, y si hay algún error o falta hacer alguna modificación, podés sugerirlo en los comentarios así lo actualizo.


Economía basada en recursos

Unos cuántos años atrás, digamos, luego de conocer el Software Libre y empezar a creer en que todo lo que tenemos lo podemos compartir y que la gente debería trabajar por placer / amor a lo que hace en vez de por dinero, flashié en que se podía crear una sociedad sin dinero. Básicamente, el ejemplo que siempre daba era:

Imaginate que cada persona hace lo que realmente ama. Por ejemplo, a mi me apasiona programar y me divierte mucho. Así como yo, hay gente a la que le apasiona conducir o tener una granja por ejemplo. Entonces, cuando esté en mi casa a punto de preparme una ensalada, lo único que debería hacer (en este nuevo mundo dónde no existe el dinero) es ir a la verdulería, saludar a Carlitos y decirle que me llevo un par de tomates para mi ensalada. En eso del saludo que va y que viene, Carlitos me dice: "Después me gustaría hablar con vos, porque quiero hacer un sitio web sobre los productos que tenemos acá, sus características y propiedades".

¡Genial! Algo así me imaginé durante algunos años. Pero mi poder de imaginación era bastante vago, y no podía explicar muchísimas cosas acerca de cómo funcionaría mi idea loca. Aunque básicamente se basaba en eso. En tener lo que necesitamos a nuestro alcance en el momento que lo necesitamos sin costo alguno y a cambio de nada.

Durante mis años viviendo en Santa Fe, me miré los dos primeros documentales de Zeitgeist y quedé tildado. No entendí casi nada de la parte de cómo se hace el dinero y porqué es ilógico que así sea. De que una economía basada en dinero va en dirección al colapso, que el dinero genera el 90% de los problemas que tenemos hoy en día, y un gran etc. Así que, a mitad de la segunda aborté mi plan de terminar de verla porque ya estaba muy perdido.

Aproximadamente 1 mes atrás, hablando con una chica (que no conocía) en el parque me sugirió que busque información sobre Jacque Fresco y sobre Nassim Haramein. Cuando volví a casa, a través de Jacque Fresco volví a caer en los documentales de Zeitgeist y me los miré a los tres con Melina. Esta vez, con un poco más de experiencia sobre qué es la plata y como sobre se mueve el mundo (sigue siendo vaga, pero es mayor que hace 5 años atrás), entendí un 90% de los documentales y quedé conmocionado. Muchas de las cosas de las que habla el documental yo las vengo pensando hace bastante tiempo (como el mundo sin dinero), pero no tuve nunca la capacidad de explicarlo ni de expandir esa idea dentro de mi mente si quiera. La verdad que ver esos documentales aclararon muchísimas dudas sobre "mi propia idea". Fue tan claro para mi rellenar todos esos huecos que tenía en mi cabeza sobre cómo y porqué lo que yo había pensado puede funcionar.

Sin embargo, el motivo por el que Jacque Fresco plantea toda esta movida, es porque estamos explotando a más no poder la isla en la que vivimos: La Tierra, y que básicamente hasta que no estemos al borde de extinguirnos no nos vamos a dar cuenta de lo que estamos haciendo.

Me parece que toda esta movida está buena para informarse al menos y poder crear un punto de vista personal. Digo, por lo menos decir: "Todo esto es una pelotudes por ésto y aquello."

Si hoy mismo juntamos todo el dinero que existe en el mundo, éste no alcanza para pagar todas las deudas que tenemos.