[pyar] [RFC] PyOpaque - soporte de atributos privados en python

david tenuki en gmail.com
Mie Jun 27 03:46:41 ART 2012


2012/6/26 Luciano Bello <lbello en gmail.com>:
> 2012/6/26 david <tenuki en gmail.com>:
>> que onda hacer un proxy de random.. random.py.. que me wrappee
>> shufle() y despues me muestre el contenido?
>
> La instancia ya está creada y shuffle ya ha sido ejecutado.
>
>> estoy casi seguro que se puede hacer..
>
> Como dice don Linus: talk is cheap. show me the code :)

Es que es una pavada lo que digo.. es de como está armado el ejemplo...
piso "random" con un random que funciona igual que el de python y hago que
me muestre el mazo cada vez que se calcule uno:

aweil en patashnik:~$ cd tmp
aweil en patashnik:~/tmp$ unzip
/home/aweil/Downloads/bvdelft-PyOpaque-fd29f6b.zip
Archive:  /home/aweil/Downloads/bvdelft-PyOpaque-fd29f6b.zip
fd29f6b5b630e8b33c9ad270d0c23107fae9fdce
  creating: bvdelft-PyOpaque-fd29f6b/
 inflating: bvdelft-PyOpaque-fd29f6b/README
 inflating: bvdelft-PyOpaque-fd29f6b/TODO.md
  creating: bvdelft-PyOpaque-fd29f6b/doc/
 inflating: bvdelft-PyOpaque-fd29f6b/doc/drawing3.png
 inflating: bvdelft-PyOpaque-fd29f6b/doc/index.html
 inflating: bvdelft-PyOpaque-fd29f6b/drawing3.odg
  creating: bvdelft-PyOpaque-fd29f6b/examples/
 inflating: bvdelft-PyOpaque-fd29f6b/examples/capability.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/croupier.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/croupier_file.py
extracting: bvdelft-PyOpaque-fd29f6b/examples/croupier_policy.cfg
 inflating: bvdelft-PyOpaque-fd29f6b/examples/demonstrationNotes.txt
 inflating: bvdelft-PyOpaque-fd29f6b/examples/exampleCapability.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/limitations.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/memory.py
  creating: bvdelft-PyOpaque-fd29f6b/examples/notdemo/
 inflating: bvdelft-PyOpaque-fd29f6b/examples/notdemo/account.cfg
 inflating: bvdelft-PyOpaque-fd29f6b/examples/notdemo/account.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/notdemo/password.py
 inflating:
bvdelft-PyOpaque-fd29f6b/examples/notdemo/restricting_imports.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/notdemo/simple.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/untrusted.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/untrusted0.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/untrusted1.py
 inflating: bvdelft-PyOpaque-fd29f6b/examples/untrusted2.py
  creating: bvdelft-PyOpaque-fd29f6b/opaque/
 inflating: bvdelft-PyOpaque-fd29f6b/opaque/__init__.py
 inflating: bvdelft-PyOpaque-fd29f6b/opaque/cOpaquemodule.cpp
 inflating: bvdelft-PyOpaque-fd29f6b/opaque/cOpaquemodule.h
 inflating: bvdelft-PyOpaque-fd29f6b/opaque/opaque.py
 inflating: bvdelft-PyOpaque-fd29f6b/setup.py
 inflating: bvdelft-PyOpaque-fd29f6b/tests.py
aweil en patashnik:~/tmp$ cd bvdelft-PyOpaque-fd29f6b/

aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b$ ls
doc  drawing3.odg  examples  opaque  README  setup.py  tests.py  TODO.md
aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b$ python setup.py build
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/opaque
copying opaque/__init__.py -> build/lib.linux-x86_64-2.7/opaque
copying opaque/opaque.py -> build/lib.linux-x86_64-2.7/opaque
running build_ext
building 'opaque.cOpaque' extension
creating build/temp.linux-x86_64-2.7
creating build/temp.linux-x86_64-2.7/opaque
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall
-Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c
opaque/cOpaquemodule.cpp -o
build/temp.linux-x86_64-2.7/opaque/cOpaquemodule.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for
Ada/C/ObjC but not for C++ [enabled by default]
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions
-Wl,-Bsymbolic-functions -Wl,-z,relro
build/temp.linux-x86_64-2.7/opaque/cOpaquemodule.o -o
build/lib.linux-x86_64-2.7/opaque/cOpaque.so


aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b$ ls -la
total 76
drwxrwxr-x  6 aweil aweil  4096 Jun 27 03:27 .
drwxr-xr-x 65 aweil aweil  4096 Jun 27 03:27 ..
drwxrwxr-x  4 aweil aweil  4096 Jun 27 03:27 build
drwxrwxr-x  2 aweil aweil  4096 Jun 26 07:26 doc
-rw-rw-r--  1 aweil aweil 31614 Jun 26 07:26 drawing3.odg
drwxrwxr-x  3 aweil aweil  4096 Jun 26 07:26 examples
drwxrwxr-x  2 aweil aweil  4096 Jun 26 07:26 opaque
-rw-rw-r--  1 aweil aweil   199 Jun 26 07:26 README
-rw-rw-r--  1 aweil aweil  1735 Jun 26 07:26 setup.py
-rwxr-xr-x  1 aweil aweil  7518 Jun 26 07:26 tests.py
-rw-rw-r--  1 aweil aweil   583 Jun 26 07:26 TODO.md

aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ ln -s
/home/aweil/tmp/bvdelft-PyOpaque-fd29f6b/build/lib.linux-x86_64-2.7/opaque
aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b$ cd examples/
aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ ls
capability.py     croupier_policy.cfg  demonstrationNotes.txt
 limitations.py  notdemo  untrusted0.py  untrusted2.py
croupier_file.py  croupier.py          exampleCapability.py    memory.py
    opaque   untrusted1.py  untrusted.py


aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ cp
/usr/lib/python2.7/random.py .
aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ vim random.py
aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ diff -U 15
/usr/lib/python2.7/random.py random.py
--- /usr/lib/python2.7/random.py 2012-04-20 20:35:44.000000000 -0300
+++ random.py 2012-06-27 03:30:36.314311457 -0300
@@ -275,30 +275,32 @@

    def shuffle(self, x, random=None, int=int):
        """x, random=random.random -> shuffle list x in place; return None.

        Optional arg random is a 0-argument function returning a random
        float in [0.0, 1.0); by default, the standard random.random.
        """

        if random is None:
            random = self.random
        for i in reversed(xrange(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = int(random() * (i+1))
            x[i], x[j] = x[j], x[i]

+        print 'result x is:',x
+
    def sample(self, population, k):
        """Chooses k unique random elements from a population sequence.

        Returns a new list containing elements from the population while
        leaving the original population unchanged.  The resulting list is
        in selection order so that all sub-slices will also be valid random
        samples.  This allows raffle winners (the sample) to be partitioned
        into grand prize and second place winners (the subslices).

        Members of the population need not be hashable or unique.  If the
        population contains repeats, then each occurrence is a possible
        selection in the sample.

        To choose a sample in a range of integers, use xrange as an
argument.
        This is especially fast and space efficient for sampling from a


aweil en patashnik:~/tmp/bvdelft-PyOpaque-fd29f6b/examples$ python -i
croupier.py
result x is: [51, 4, 34, 18, 19, 37, 43, 5, 22, 21, 3, 29, 42, 13, 45, 39,
12, 23, 48, 7, 40, 32, 31, 49, 11, 41, 25, 1, 0, 17, 15, 27, 36, 47, 50,
38, 10, 46, 35, 14, 6, 20, 44, 9, 16, 30, 8, 2, 24, 26, 33, 28]
>>> jack.drawCard()
28
>>> jack.drawCard()
33
>>>



>> pps: en el caso de los file capped... me imagino que por ahí ahí se
>> puede instalar un import hook, definir / pisar file/open y dar un file
>> object a quien lo pida, de forma de guardarlo en alguna global y
>> despues queriearlo desde afuera.. me explico?
>
> En example pusimos el ejemplo de capabilities del file. Pero si,
> requiere ser pulido.
> Gracias por tus comentarios! -luciano


Por eso.. lo que muestro ahí arriba, está bien, es un ejemplo trucho,
abusando quizás de como está armado el challenge. Una cosa que tiene
python, ni hace falta que lo diga en realidad, es que es todo muy abierto,
entonces genera muchos lugares por donde "acceder" a lo mismo. Ojo no
critico que sea muy abierto.. me gusta que sea así.

Y por eso mismo, creo, es muy interesante lo que hicieron uds. Después voy
a probar si con import hooks se puede hacer lo mismo que hago con random,
sin tener que copiarme el módulo random, que siempre se puede hacer pero en
algún caso puede ser trabajoso.


Y me gustaría entender que es lo que hace, de lo poco que ví en el código,
el tema de los safe-imports y la black list de los mismos. Está para no
permitir cosas como ctypes?

Saludos, y perdón que no hice antes el ejemplo, estoy medio a full con
varias cosas, y además, también está bueno escribir.. :-)

Y por cierto, esto no lo mandé a pyar, porque era un challenge.... pero
bueno :-)
-- 
 There is no dark side of the moon really. Matter of fact it's all dark.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120627/6b6ebf77/attachment.html>


More information about the pyar mailing list