2017-09-16 5 views
2

에 기본 매개 변수를 전달 나는 기능을 가지고중첩 된 기능 파이썬

foo(x, setting1=def1, settings2=def2) 

(실제로 내가 외부에만 1을 설정할 필요가있는 기본 매개 변수의 무리와 함께 타사 라이브러리 함수가 있지만 위해서 예를들 ..)

나는

bar(y, settings2_in=def2) 
    x = get_x(y) 
    foo(x, settings2=settings2_in) 

이 괜찮에서이 호출하고 있지만, 문체 차라리 매개 변수의 이름을 부르는 것 settings2_insettings2. 다른 레이어를 계속 전달할 때 매개 변수의 이름을 계속 변경해야하며 추악 해집니다.

bletch(z, settings2_in_2=def2) 
    y = get_y(z) 
    bar(y, settings2_in=settings_in_2) 

아래 기본 매개 변수 이런 식으로 함수의 여러 층의 일부를 전달하는 "좋은"/ 파이썬의 방법이 있습니까?

파이썬은 운동하기에 충분히 영리 그게 내가 할 경우 : settings2의 2가 사용하는 상황에서 다른 것을

bar(y, settings2=def2) 
    x = get_x(y) 
    foo(x, settings2=settings2) 

?

+0

그냥'bar (y, ** kwargs)'다음에'foo (x, ** kwargs)'라고 생각합니다. –

+0

** kwargs는 멋지게 할 수있는 것처럼 보입니다. 감사! –

답변

1

질문에 직접 대답하십시오 : 예, Python은 로컬 변수와 아웃 바운드 함수 매개 변수를 같은 이름으로 혼동하지 않을 정도로 충분히 똑똑합니다. 예 : 회수 라인에서

def x(a): 
    ... 

def y(a, b): 
    return x(a=a) 

가 오른쪽 a 기능 y 왼손 a에 전달 된 파라미터와 지역 변수 것은 x를 작동하는 파라미터이다.

호출 된 함수의 매개 변수 이름은 호출 된 함수의 매개 변수 목록의 네임 스페이스에 있으며 호출 컨텍스트의 로컬 및 전역 변수와 관련이 없습니다.

+0

그레이트 - 아마 그냥 테스트를 거쳤습니다,하지만 고마워요, 감사합니다 –

+0

난 당신이 새로운 StackOverflow 사용자를 참조하십시오 한 힌트 - 일단 당신이 어떤 대답이 당신에게 가장 도움이 결정하면 확인 표시를 사용하여 그 대답을 받아 들인다. –

+0

좋은 답변이지만 직접적인 답변입니다. 또한 감사합니다. –

0

모든 매개 변수를 다시 정의하지 않고도 **kwargs을 사용하여 모든 키워드 인수를 캡처 할 수 있습니다.

그런 다음 foo 기능에

def foo(x, setting1="def1", settings2="def2"): 
    print(setting1,settings2) 


def bar(y,**kwargs): 
    foo(y,**kwargs) 

bar(12) 
bar(y=12) 
bar(12,setting1="other") 

결과를 키워드 인수를 전달합니다

def1 def2 
def1 def2 
other def2 

메모를 그 y 키워드는 작품으로 y 전달, 외부 kwargs 때문이다.

유일한 단점은 실제로 bar으로 전달할 수있는 것을 모르는 것이지만 foo이 받아들이는 것에 따라 논리적입니다. 함수에 문서 문자열을 추가하여이를 확인하십시오.