2014-01-05 3 views
2

Python beginner here. 슈퍼 기본 질문에 대한 죄송합니다.파이썬에서 함수 인자 값을 확인하는 방법은 무엇입니까?

빈 문자열이면 값을 없음으로 변환 할 수 있도록 모든 인수 값을 확인하고 싶습니다.

인수 목록을 얻는 방법을 알아 냈지만 인수 값을 얻는 방법을 알 수 없습니다.

def __init__(self, first, middle, last): 
    # convert blank attributes to None 
    import inspect 
    args = inspect.getargspec(self.__init__)[0] 
    for arg in args: 
     print 'arg: ' + str(arg) 
     if arg == '': 
      arg = None 

이 인수 이름을 얻을 수 있지만 그 값 :

는 내가 지금 가지고있는 것은 이것이다. 값을 어떻게 얻을 수 있습니까?

감사합니다.

만 3 인수가

답변

3

은 검사와 신경 단지 직접 참조하거나 포괄 인수 *args 사용하지 않는 : 당신은 locals() dictionary을 통해 기능 주민들에 액세스 할 수 있습니다

def __init__(self, *args): 
    args = [argument or None for argument in args] 

을, 그러나 그것은이다 읽기 전용 인 경우, 일반적으로 이 아니며은 단순한 기본값을 설정하는 데 사용합니다.

class SomeClass(object): 
    @reset_to_none 
    def __init__(self, first, middle, last): 
     # any of `first`, `middle` or `last` being empty strings will be set to `None` 
+0

ents, 난 그냥 다른 게시물을 깔끔하게 만들기 위해 꺼내. 나는 다른 인수를 함수에 넘겨 주면 통지를 받기 때문에 * args가 아닌 명시적인 인수를주는 것과 비슷합니다. – ems

+0

@ems : 이미 일반 데코레이터 솔루션으로 업데이트되었습니다. –

+0

Dang, 방금 장식을 직접 해보고 싶었습니다. +1 –

2

당신은 모든 빈을 변환하는 decorator를 작성할 수

from functools import wraps 

def reset_to_none(func): 
    @wraps(func) 
    def wrapper(*args, **kw): 
     args = [arg if not isinstance(arg, str) or arg else None for arg in args] 
     kw = {k: arg if not isinstance(arg, str) or arg else None for k, arg in kw.items()} 
     return func(*args, **kw) 
    return wrapper 

은 다음 __init__ 방법이 적용 : 당신이 일반적인 접근 방식을 원하지 않으면

, 나는 장식을 사용하십시오 문자열 인수를 None :

from functools import wraps 

def emptyToNoneParameters (f): 
    @wraps(f) 
    def inner (*args, **kwargs): 
     newArgs = [None if a == '' else a for a in args] 
     newKwargs = {k: None if v == '' else v for k, v in kwargs.items()} 
     return f(*newArgs, **kwargs) 
    return inner 

class MyType: 
    @emptyToNoneParameters 
    def __init__ (self, first, middle, last): 
     print(first, middle, last) 

x = MyType('a', '', '') 
# prints: 'a', None, None 
관련 문제