Функциональные декораторы

Помимо использования Dev Tools, чтобы убедиться, что кеш отключен, вы можете отредактировать файл Web.config и сказать IIS не кэшировать ваши Angular-файлы:

<configuration>

  <!-- Disable IIS caching for directories containing Angular templates and scripts -->
  <location path="app">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="DisableCache"/>
      </staticContent>
    </system.webServer>
  </location>

...
</configuration>

Мой корневой каталог Angular - app/ , Возможно, вам придется изменить в соответствии с вашей файловой структурой.

6
задан Stephan202 20 May 2009 в 17:43
поделиться

3 ответа

Хотя inspect может немного помешать вам, то, что вы хотите, в целом невозможно :

def f(*args):
    pass

Теперь, сколько аргументов f взять? Поскольку * args и ** kwargs допускают произвольное количество аргументов, нет способа определить количество аргументов, требуемых функции. На самом деле, бывают случаи, когда функция действительно обрабатывает столько, сколько было брошено ей!


Изменить: если вы готовы мириться с подробным в качестве специального аргумента ключевого слова, вы можно сделать это:

import time

def timed(f):
    def dec(*args, **kwargs):
        verbose = kwargs.pop('verbose', False)
        t = time.clock()

        ret = f(*args, **kwargs)

        if verbose:
            print("%s executed in %ds" % (f.__name__, time.clock() - t))

        return ret

    return dec

@timed
def add(a, b):
    return a + b

print(add(2, 2, verbose=True))

(Спасибо Alex Martelli за совет kwargs.pop !)

9
ответ дан 8 December 2019 в 13:48
поделиться

это может быть сложно, но вы можете что-то сделать в этих строках. Приведенный ниже код пытается удалить все лишние аргументы и распечатывает их.

def mydeco(func):
    def wrap(*args, **kwargs):
        """
        we want to eat any extra argument, so just count args and kwargs
        and if more(>func.func_code.co_argcount) first take it out from kwargs 
        based on func.func_code.co_varnames, else last one from args
        """
        extraArgs = []

        newKwargs = {}
        for name, value in kwargs.iteritems():
            if name in func.func_code.co_varnames:
                newKwargs[name] = value
            else:
                extraArgs.append(kwargs[name])

        diff = len(args) + len(newKwargs) - func.func_code.co_argcount
        if diff:
            extraArgs.extend(args[-diff:])
            args = args[:-diff]

        func(*args, **newKwargs)
        print "%s has extra args=%s"%(func.func_name, extraArgs)

    return wrap

@mydeco
def func1(a, b, c=3):
    pass

func1(1,b=2,c=3, d="x")
func1(1,2,3,"y")

вывод

func1 has extra args=['x']
func1 has extra args=['y']
0
ответ дан 8 December 2019 в 13:48
поделиться

+1 к ответу Stephan202, однако (помещая это в отдельный ответ, поскольку комментарии плохо форматируют код!), Следующий фрагмент кода в этом ответе:

verbose = False
if 'verbose' in kwargs:
     verbose = True
     del kwargs['verbose']

может быть выражен гораздо более четко и кратко, как:

verbose = kwargs.pop('verbose', False)
8
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: