4
  • 私は Django を初めて使用し、Java/Spring のバックグラウンドを持っています。
  • DjangoまたはPythonで実行できる次のようなデコレータがあるかどうか疑問に思っていますか?

欲しい

def addToList(@not_none a, @not_none b):
    # so that I do not check for nullity explicitly  
    do_things_with_a(a)
    do_things_with_b(b)
  • これはJavaで簡単に取得できるものであるため、Python/Djangoにあるかどうかを調べるだけです
4

4 に答える 4

5

One doesn't typically constraint data-types in Python. Also, decorators can only be applied to classes and to methods/functions.

Although, you shouldn't really be doing this, this is how you would.

(You could amend this to accept argument names to enforce constraints on with a little work).

def not_none(f):
    def func(*args, **kwargs):
        if any(arg is None for arg in args):
            raise ValueError('function {}: does not take arguments of None'.format(f.__name__))
        return f(*args, **kwargs)
    return func

@not_none
def test(a, b):
    print a, b
于 2012-07-16T12:58:54.813 に答える
2

rejectNone次のようにデコレータを記述できます。

def rejectNone(f):
    def myF(*args, **kwargs):
        if None in args or None in kwargs.values():
            raise Exception('One of the arguments passed to {0} is None.'.format(f.__name__)
        return f(*args, **kwargs)
    return myF

@rejectNone
def f(a, b, k=3):
   print a * b

Exception引数を指定して呼び出そうとするとf、が表示されますNone。デコレータは関数またはクラスメソッドに適用できますが、関数パラメータの前に配置することはできないことに注意してください。

于 2012-07-16T12:57:02.443 に答える
1

これが遅いことは知っていますが、役立つかもしれない人には.

ここにnull許容フィールドの引数を受け入れるジョンの答えに基づいた簡単なレポがあります。


def not_none(nullable_parameters=None):

    def the_actual_test(f, args, filter_array):
        has_none = False
        bad_parameters = []

        if type(filter_array) is str:

            filter_array = [filter_array]

        if not filter_array:

            if any(arg[1] is None for arg in args):
                raise ValueError('function {}: Parameters cannot be None. '.format(f.__name__))

        elif type(filter_array) is list:
            for a in args:
                for ff in filter_array:
                    if a[0] != ff:
                        if a[1] is None:
                            has_none = True
                            bad_parameters.append(a[0])
                            break

        if has_none:
            raise ValueError('function {}: Parameters {} cannot be None. '.format(f.__name__, bad_parameters))

    def real_decorator(f):


        v_names = f.__code__.co_varnames

        def wrapper(*args, **kwargs):
            n_args = []

            for a in range(0, len(args)):
                n_args.append((v_names[a], args[a]))

            the_actual_test(f, n_args, nullable_parameters)
            result = f(*args, **kwargs)

            return result
        return wrapper

    return real_decorator

使用法

from not_none import not_none

@not_none()
def no_none(a,b):
    return (a,b)

@not_none(nullable_parameters=["b"])
def allow_b_as_none(a,b):
    return (a,b)

#passes
no_none(1,1)

#fails
no_none(None,1)

#passes
allow_b_as_none(1,None)

#fails
allow_b_as_none(None,1)
于 2018-12-05T19:34:17.067 に答える