Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Bloqueado

Es­ta es tal vez la co­sa más ob­via que no to­do el mun­do ve: pa­ra ha­cer co­sas hay que ha­cer­la­s. La ma­ne­ra de es­cri­bir so­ftwa­re li­bre es es­cri­bir so­ftwa­re que es li­bre. Pa­ra ir a Ala­ska hay que ir­se. A Ala­ska. Pa­ra es­cri­bi­r, hay que es­cri­bi­r. Pa­ra ha­cer mú­si­ca, hay que to­car mú­si­ca. Pa­ra ha­cer pan, hay que ha­cer pan.

¿Va a es­tar siem­pre bue­no ese pan? ¿Vas a es­cri­bir siem­pre co­sas in­te­re­san­tes? ¿Vas a lle­gar a Ala­ska? No. Vas a fra­ca­sar.

Pe­ro si no ha­cés ca­ga­das pri­me­ro, no hay ma­ne­ra de ha­cer co­sas me­jo­res des­pué­s. Creo que fue Ama­deo Ca­rri­zo el que di­jo de un ar­que­ro jo­ven "No es ma­lo, fal­ta que le ha­gan do­s, tre­cien­tos go­les más pa­ra que sea bue­no­".

Ten­go un lar­go his­to­rial de fra­ca­so­s. Ten­go una cor­ta lis­ta de éxi­to­s. Se­pan dis­cul­pa­r.

Problemas de abandono: rst2pdf

Así que lo voy a re­to­ma­r. Voy a de­di­car­le unas 4ho­ras por se­ma­na.El plan es:

  1. Jun­­tar pa­r­­ches que es­­tán jun­­tan­­do tie­­rra en el is­­sue tra­­cker

  2. Arre­­glar al­­gu­­nos bu­­gci­­tos

  3. Ha­­cer un re­­lea­­se con 1) y 2)

Y por su­pues­to:

  1. No aban­­do­­­na­r­­lo de nue­­vo

Mientras tanto, acá hay algo interesante de lo que recién me enteré. Dimitri Christodoulou hackeó rst2pdf para que soporte la directiva raw:: html.

Eso, ami­go­s, es tan lo­co que lo ten­go que ro­bar (con el cré­di­to co­rrec­to, etc :-)

Y Di­mi­tri, o cual­quier otro que quie­ra ha­cer al­go co­pa­do con rs­t2­pdf, ¡a­vi­sen! ¡Les doy co­m­mi­t!

Python context managers: son fáciles!

Yo es­ta­ba el otro día tra­tan­do de ha­cer co­sas de she­ll scrip­ting con py­thon (co­mo par­te de un se­tu­p.­py mons­truo) y me mo­les­ta­ba que en she­ll es muy fá­cil ha­cer es­to:

cd foo
bar -baz
cd -

O es­to:

pushd foo
bar -baz
popd

O es­to:

(cd foo && bar -baz)

Y en py­thon te­nia que ha­cer es­to, que es lar­go y feo:

cwd = os.getcwd()
try:
    os.chdir('foo')
    os.system('bar -baz')
finally:
    os.chdir(cwd)

Cuan­do en rea­li­dad quie­ro es­to:

with os.chdir('foo'):
    os.system('bar -baz')

Por su­pues­to, eso no es­tá. En­ton­ce­s, pre­gun­té, co­mo se ha­ce eso? Y tu­ve va­rias res­pues­ta­s:

  1. Usá Fa­­bri­­c:

    wi­th cd("­foo"):
        run("­ba­r")
  2. No es di­­fí­­ci­­l:

    cla­ss Dir­Con­text­M(ob­jec­t):
        def __i­ni­t__(sel­f, new_­di­r):
            se­l­f.­new_­dir = new_­dir
            se­l­f.ol­d_­dir = No­ne
    
        def __en­te­r__(sel­f):
            se­l­f.ol­d_­dir = os.­ge­tcw­d()
            os.­ch­di­r(sel­f.­new_­di­r)
    
        def __e­xi­t__(sel­f, *_):
            os.­ch­di­r(sel­f.ol­d_­di­r)
  3. Es más fá­­ci­­l:

    from con­tex­tlib im­port con­text­ma­na­ger
    
    @con­text­ma­na­ger
    def cd(­pa­th):
        ol­d_­dir = os.­ge­tcw­d()
        os.­ch­di­r(­pa­th)
        yield
        os.­ch­di­r(ol­d_­di­r)
  4. Es­­tá bue­­­no, agre­­gué­­mo­s­­lo a pa­­th.­­py pa­­th.­­py

  5. Me­­jor atra­­par ex­­ce­p­­cio­­­nes:

    @con­text­ma­na­ger
    def cd(­pa­th):
        ol­d_­dir = os.­ge­tcw­d()
        os.­ch­di­r(­pa­th)
        tr­y:
            yield
        fi­na­ll­y:
            os.­ch­di­r(ol­d_­di­r)

Apren­dí co­mo ha­cer con­text ma­na­ger­s, so­bre con­tex­tli­b, so­bre fa­bric y so­bre pa­th.­p­y. Na­da mal pa­ra 15 mi­nu­tos :-)


Contents © 2000-2023 Roberto Alsina