Program Tip

함수에 전달 된 인수의 목록 / 튜플 / 사전을 가져 오나요?

programtip 2020. 12. 1. 19:38
반응형

함수에 전달 된 인수의 목록 / 튜플 / 사전을 가져 오나요?


다음과 같은 기능이 주어집니다.

def foo(a, b, c):
    pass

구조를 직접 구축하지 않고도 전달 된 인수의 목록 / 튜플 / 딕셔너리 / 등을 어떻게 얻을 수 있습니까?

특히, Python 버전의 JavaScript arguments키워드 또는 PHP func_get_args()메서드를 찾고 있습니다.

내가 찾고 있지 않은 것은*args 또는 사용하는 솔루션입니다 **kwargs. 함수 정의에 인수 이름을 지정해야하지만 (전달되고 있는지 확인하기 위해) 함수 내에서 목록 또는 dict 스타일 구조로 작업하고 싶습니다.


다음 locals()과 같이 함수에서 지역 변수의 사전을 가져 오는 데 사용할 수 있습니다 .

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

>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}

그러나 이것은 locals()함수에 전달 된 인수뿐만 아니라 로컬 범위의 모든 변수 반환하므로 함수의 맨 위에 호출하지 않으면 결과에 원하는 것보다 더 많은 정보가 포함될 수 있습니다. :

def foo(a, b, c):
    x = 4
    y = 5
    print locals()

>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}

다른 답변에서 제안한 것처럼 함수 상단에 필요한 변수 목록이나 사전을 구성하는 것이 좋습니다. 더 명확하고 IMHO라는 더 명확한 방식으로 코드의 의도를 전달합니다.


inspect 모듈을 사용할 수 있습니다.

def foo(x):
    return x

inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

이 중 중복 .


인수가 예상과 다르면 사용 *args하거나 **kwargs예외를 throw합니다.

파이썬에서 확인한 것과 동일한 오류를 갖고 싶다면 다음과 같이 할 수 있습니다.

def check_arguments(function_name,args,arg_names):
    missing_count = len(arg_names) - len(args)
    if missing_count > 0:
        if missing_count == 1:
            raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1]))
        else:
            raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))

같은 것과 함께 사용

def f(*args):
    check_arguments("f",args,["a","b","c"])
    #whatever you want
    ...

중복 (이전 ??) 질문에서 허용 된 답변에서 https://stackoverflow.com/a/582206/1136458 :

    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)

헤더에 매개 변수를 지정 했습니까?

단순히 본문에서 동일한 정보를 사용하지 않는 이유는 무엇입니까?

def foo(a, b, c):
   params = [a, b, c]

내가 무엇을 놓쳤습니까?


다음을 사용하여 목록을 만들 수 있습니다.

인수 = [a, b, c]

다음을 사용하여 튜플을 쉽게 만들 수 있습니다.

인수 = (a, b, c)

데코레이터를 사용하는 한 가지 해결책이 여기 있습니다 .


class my_class():
        compulsory_default_kwargs = {'p':20,'q':30,'r':40}
        formal_args_names = ['var1','var2']
        def __init__(self,*args,**kwargs):
            for key , value in locals().items():
                if((key == 'args')):
                    if(len(args) == len(my_class.formal_args_names)):
                        for key_name , arg_value in zip(my_class.formal_args_names,args):
                            setattr(self,key_name,arg_value)
                    else:
                        raise Exception ('Error - Number of formal arguments passed mismatched required {} whereas passed {}'.format(len(my_class.formal_args_names),len(args)))

                elif((key == 'kwargs') & (len(kwargs)!=0)):
                    for kw_key , kw_value in kwargs.items():
                        if kw_key in my_class.compulsory_default_kwargs.keys():
                            setattr(self,kw_key,kw_value)
                        else:
                            raise Exception ('Invalid key-word argument passed {}'.format(kw_key))
                #elif((key!='self') & (key!='kwargs') ):
                   # setattr(self,key,value)
            for key , value in my_class.compulsory_default_kwargs.items():
                if key not in kwargs.keys():
                    setattr(self,key,value)


    this_value = 'Foo'    
    my_cl = my_class(3,this_value,p='B',r=10)
    my_cl.__dict__

참고 URL : https://stackoverflow.com/questions/2521901/get-a-list-tuple-dict-of-the-arguments-passed-to-a-function

반응형