[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