함수에 전달 된 인수의 목록 / 튜플 / 사전을 가져 오나요?
다음과 같은 기능이 주어집니다.
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__
'Program Tip' 카테고리의 다른 글
다른 동일한 하위 항목이 아닌 직계 하위 항목 만 대상으로하는 CSS 선택기 (0) | 2020.12.01 |
---|---|
VisualVM을 사용하여 Tomcat 애플리케이션 프로파일 링 (0) | 2020.12.01 |
UDID 및 재 컴파일을 관리하지 않고 무선으로 iOS 애플리케이션을 배포하는 방법 (0) | 2020.12.01 |
Java가 SSL 핸드 셰이크 중에 클라이언트 인증서를 보내지 않는 이유는 무엇입니까? (0) | 2020.12.01 |
현재 준비되었거나 커밋 된 git에서 무시한 파일을 나열하는 방법은 무엇입니까? (0) | 2020.12.01 |