반응형
Python 인수
나중 호출을 위해 nullary functor를 저장하기 위해 Python 메소드에 인수를 바인딩해야 할 필요가 있습니까? C ++의 boost::bind
.
예를 들면 :
def add(x, y):
return x + y
add_5 = magic_function(add, 5)
assert add_5(3) == 8
functools.partial
일부 또는 모든 인수가 고정 된 함수를 래핑하는 콜 러블을 반환합니다.
import sys
import functools
print_hello = functools.partial(sys.stdout.write, "Hello world\n")
print_hello()
Hello world
위의 사용법은 다음과 가변 lambda
합니다.
print_hello = lambda *a, **kw: sys.stdout.write("Hello world\n", *a, **kw)
나는 boost :: bind에 익숙하지 않지만 사용하는 partial
함수 functools
는 좋은 시작일 수 있습니다.
>>> 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
functools.partial
수없는 사용할 경우 쉽게 에뮬레이션 할 수 있습니다.
>>> make_printer = lambda s: lambda: sys.stdout.write("%s\n" % s)
>>> import sys
>>> print_hello = make_printer("hello")
>>> print_hello()
hello
또는
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
람다를 사용하면 더 약간 인수로 명명되지 않은 새 함수를 만들고 함수를 호출 할 수 있습니다!
>>> 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
편집하다
https://docs.python.org/2/library/functools.html#functools.partial
함수 호출에서 명명 된 인수 바인딩을 사용하려는 경우에도 적용 할 수 있습니다.
>>> from functools import partial
>>> barfoo = partial(foobar, x=10)
>>> barfoo(y=5,z=6)
21
그래도
>>> 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
이것도 작동합니다.
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
Functor는 Python에서 이런 방식으로 정의 할 수 있습니다. 그들은 호출 가능한 객체입니다. "바인딩"은 인수 값을 설정합니다.
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
다음과 같은 일을 할 수 있습니다.
x= SomeFunctor( 3.456 )
x( arg2=123 )
y= SomeFunctor( 3.456, 123 )
y()
참고 URL : https://stackoverflow.com/questions/277922/python-argument-binders
반응형
'ProgramingTip' 카테고리의 다른 글
Ubuntu에 Android Studio를 설치하는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
.NET 2.0 실행의 LINQ (0) | 2020.12.14 |
Django에서 특정 권한 그룹을 가진 모든 사용자 목록을 얻는 방법 (0) | 2020.12.14 |
자동으로 INotifyPropertyChanged (0) | 2020.12.14 |
LaTeX의 반복 (0) | 2020.12.14 |