ruta - navegar entre carpetas con python
Carpetas de argumentos de Python (6)
Los funtores se pueden definir de esta manera en Python. Son objetos invocables. El "enlace" simplemente establece valores de argumento.
class SomeFunctor( object ):
def __init__( self, arg1, arg2=None ):
self.arg1= arg1
self.arg2= arg2
def __call___( self, arg1=None, arg2=None ):
a1= arg1 or self.arg1
a2= arg2 or self.arg2
# do something
return
Puedes hacer cosas como
x= SomeFunctor( 3.456 )
x( arg2=123 )
y= SomeFunctor( 3.456, 123 )
y()
¿Cómo puedo vincular argumentos a un método de Python para almacenar un functor nullary para una invocación posterior? Similar al boost::bind
C ++.
Si functools.partial
no está disponible, se puede emular fácilmente:
>>> make_printer = lambda s: lambda: sys.stdout.write("%s/n" % s)
>>> import sys
>>> print_hello = make_printer("hello")
>>> print_hello()
hello
O
def partial(func, *args, **kwargs):
def f(*args_rest, **kwargs_rest):
kw = kwargs.copy()
kw.update(kwargs_rest)
return func(*(args + args_rest), **kw)
return f
def f(a, b):
return a + b
p = partial(f, 1, 2)
print p() # -> 3
p2 = partial(f, 1)
print p2(7) # -> 8
d = dict(a=2, b=3)
p3 = partial(f, **d)
print p3(), p3(a=3), p3() # -> 5 6 5
Esto funcionaría, también:
def curry(func, *args):
def curried(*innerargs):
return func(*(args+innerargs))
curried.__name__ = "%s(%s, ...)" % (func.__name__, ", ".join(map(str, args)))
return curried
>>> w=curry(sys.stdout.write, "Hey there")
>>> w()
Hey there
functools.partial
devuelve una función envolvente invocable con algunos o todos los argumentos congelados.
import sys
import functools
print_hello = functools.partial(sys.stdout.write, "Hello world/n")
print_hello()
Hello world
El uso anterior es equivalente a la siguiente lambda
.
print_hello = lambda *a, **kw: sys.stdout.write("Hello world/n", *a, **kw)
No estoy demasiado familiarizado con boost :: bind, pero la función partial
de functools
puede ser un buen comienzo:
>>> from functools import partial
>>> def f(a, b):
... return a+b
>>> p = partial(f, 1, 2)
>>> p()
3
>>> p2 = partial(f, 1)
>>> p2(7)
8
¡Las lambdas te permiten crear una nueva función sin nombre con menos argumentos y llamar a la función!
>>> def foobar(x,y,z):
... print "%d, %d, %d" % (x,y,z)
>>> foobar(1,2,3) # call normal function
>>> bind = lambda x: foobar(x, 10, 20) # bind 10 and 20 to foobar
>>> bind(1) # print 1, 10, 20
>>> bind = lambda: foobar(1,2,3) # bind all elements
>>> bind() # print 1, 2, 3
editar
https://docs.python.org/2/library/functools.html#functools.partial
si está planeando usar un enlace de argumento con nombre en la llamada de función, esto también es aplicable:
>>> from functools import partial
>>> barfoo = partial(foobar, x=10)
>>> barfoo(y=5,z=6)
21
Tenga en cuenta que eso
>>> barfoo(5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foobar() got multiple values for keyword argument ''x''
>>> f = partial(foobar, z=20)
>>> f(1,1)
22