2017-09-03 16 views
1

매개 변수가 n 인 메소드가 있습니다. 나는 예컨대 :모든 기본 매개 변수 값을 없음으로 설정하는 방법

def x(a=None,b=None,c=None.......z=None): 

이 방법 내장 어떤 한 번 방법을 쓰는 동안 그들은 없음으로 기본 설정되지 않은 경우 없음에 대한 모든 매개 변수 값을 설정할 수 있는가, None 모든 기본 매개 변수 값을 설정하려면?

+0

그래, 방법의 많은 것을 달성 할 수 있지만, 모두가 "단점"어떤 종류의와 함께 올 것이다 아마 거기에 (당신이하지 않는 이상 경우 IDE 레벨에서 수행), 예를 들어 내성을 심각하게 제한 할 수 있습니다. – MSeifert

+0

내가 아는 한 멀지 만 처리 할 장식자를 쓸 수있다. – Pythonist

+0

내 질문은이 질문에서 온다. https://stackoverflow.com/questions/46025154/how-to-pass-pandas-dataframe-columns-as- kwargs/46025394 # 46025394. 나는 아무 것도 쓰지 않아야했다. 그렇게 쉬운 방법? – Dark

답변

3

, 당신은 __defaults__ 설정할 수 있습니다

def foo(a, b, c, d): 
    print (a, b, c, d) 

# foo.__code__.co_varnames is ('a', 'b', 'c', 'd') 
foo.__defaults__ = tuple(None for name in foo.__code__.co_varnames) 

foo(b=4, d=3) # prints (None, 4, None, 3) 
+0

나는 그것에 대한 어떤 속성이 있음을 알았지 만 나는 그것이 작동하도록 함수를 재 컴파일해야한다고 생각했다. 그건 꽤 똑똑 하네. – MSeifert

2

문자 그대로 모든 인수에 None을 기본값으로 추가하려면 장식자 방식이 필요합니다. 그것은 단지 다음 inspect.signature 사용할 수 있습니다 파이썬 3에 관하여 경우 수동으로 서명을 변경하기 때문에

def function_arguments_default_to_None(func): 
    # Get the current function signature 
    sig = inspect.signature(func) 
    # Create a list of the parameters with an default of None but otherwise 
    # identical to the original parameters 
    newparams = [param.replace(default=None) for param in sig.parameters.values()] 
    # Create a new signature based on the parameters with "None" default. 
    newsig = sig.replace(parameters=newparams) 
    def inner(*args, **kwargs): 
     # Bind the passed in arguments (positional and named) to the changed 
     # signature and pass them into the function. 
     arguments = newsig.bind(*args, **kwargs) 
     arguments.apply_defaults() 
     return func(**arguments.arguments) 
    return inner 


@function_arguments_default_to_None 
def x(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z): 
    print(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) 

x() 
# None None None None None None None None None None None None None None 
# None None None None None None None None None None None None 

x(2) 
# 2 None None None None None None None None None None None None None 
# None None None None None None None None None None None None 

x(q=3) 
# None None None None None None None None None None None None None None 
# None None 3 None None None None None None None None None 

그러나 그런 식으로 당신은 기능에 대한 자기 반성을 잃어 버리게된다.

하지만 문제를 완전히 해결하거나 문제를 완전히 예방할 수있는 방법이 더 있다고 생각됩니다.

일반 함수의