Закрытия в Python

Вероятно, самое простое, что нужно сделать, - это искать контент, который должен быть на незащищенной странице, а не на защищенной странице. Найдя ожидаемый контент, проверьте URL, чтобы убедиться, что вы находитесь там.

it('should not allow regular user access', test => {
  return test.remote
    .then(e2e.impersonate('test@test.com'))
    .get('/protected-route')
    .findByCssSelector('.something.that.should.be.visible')
    .getCurrentUrl()
    .then(url => {
      console.log('url', url);
      expect(url.indexOf('/landing-page')).not.toBe(-1);
      return true;
    });
});
7
задан Deduplicator 30 April 2015 в 11:37
поделиться

6 ответов

Проблема находится в Вашем обзоре, не в Ваших закрытиях. Если Вы подлежите некоторому тяжелому чтению, то можно попробовать http://www.python.org/dev/peps/pep-3104/.

Если это не так вот простое объяснение:

Проблема находится в операторе global get . global относится к наиболее удаленному объему, и так как нет никакой глобальной функции get, это бросает.

То, в чем Вы нуждаетесь, является спецификатором доступа для переменных в объеме включения а не глобальной областью видимости.

В python 3.0, поскольку я протестировал, nonlocal ключевое слово точно, вместо чего Вы нуждаетесь, global.

nonlocal get
...

В Python 2.x, я просто удалил global get и oldget ссылки и это работают правильно.

8
ответ дан 6 December 2019 в 10:54
поделиться
def memoize(fn):
  get = [lambda key: (False, None)]

  def vset(args):
    value = fn(*args)
    oldget = get[0]
    def newget(key):
      if args == key:
        return (True, value)
      return oldget(key)
    get[0] = newget
    return value

  def mfun(*args):
    found, value = get[0](args)
    if found:
      return value
    return vset(args)

  return mfun

CALLS = 0

def fib(x):
  global CALLS
  CALLS += 1
  if x<2: return x
  return fib(x-1)+fib(x-2)

@memoize
def fibm(x):
  global CALLS
  CALLS += 1
  if x<2: return x
  return fibm(x-1)+fibm(x-2)

CALLS = 0
print "fib(35) is", fib(35), "and took", CALLS, "calls"
CALLS = 0
print "fibm(35) is", fibm(35), "and took", CALLS, "calls"

Вывод:

fib(35) is 9227465 and took 29860703 calls
fibm(35) is 9227465 and took 36 calls

Подобный другим ответам, однако эти работы.:)

Важное изменение из кода в вопросе присваивает неглобальному нелокальному (добираются); однако, я также сделал некоторые улучшения при попытке поддержать Ваш *кашель*поврежденный*кашель* использование закрытия. Обычно кэш является dict вместо связанного списка закрытий.

8
ответ дан 6 December 2019 в 10:54
поделиться

Вы хотите поместить global get в начале каждой функции (кроме get самостоятельно).

def get присвоение на имя get, таким образом, Вы хотите, добираются, чтобы быть объявленным глобальным перед этим.

Помещение global get в mfun и vset заставляет их работать. Я не могу указать на правила обзора данных, который делает это необходимым, но это работает ;-)

Ваши conses вполне lispy также... :)

1
ответ дан 6 December 2019 в 10:54
поделиться

Get не глобально, но локален для окружающей функции, вот почему global сбои объявления.

Если Вы удаляете global, это все еще перестало работать, потому что Вы не можете присвоить полученному имени переменной. Для работы, вокруг которого, можно использовать объект в качестве переменной, полученной закрытиями и, чем просто свойства изменения того объекта:

class Memo(object):
    pass

def memoize(fn):
    def defaultget(key):
        return (False,)

    memo = Memo()
    memo.get = defaultget

    def vset(key, value):
        oldget = memo.get
        def newget(ky):
            if key==ky: return (True, value)
            return oldget(ky)
        memo.get = newget

    def mfun(*args):
        cache = memo.get(args)
        if cache[0]: return cache[1]

        val = apply(fn, args)
        vset(args, val)
        return val

    return mfun

Таким образом, Вы не должны присвоить полученным именам переменной, но все еще получить то, что Вы хотели.

1
ответ дан 6 December 2019 в 10:54
поделиться

Вероятно, потому что Вы хотите глобальное, добираются, в то время как это не глобальное? Между прочим, подайте заявку, удерживается от использования, используйте fn (*args) вместо этого.

def memoize(fn):
    def get(key):
        return (False,)

    def vset(key, value):
        def newget(ky):
            if key==ky: return (True, value)
            return get(ky)
        get = newget

    def mfun(*args):
        cache = get(args)
        if (cache[0]): return cache[1]

        val = fn(*args)
        vset(args, val)
        return val

    return mfun

def fib(x):
    if x<2: return x
    return fib(x-1)+fib(x-2)

def fibm(x):
    if x<2: return x
    return fibm(x-1)+fibm(x-2)

fibm = memoize(fibm)
0
ответ дан 6 December 2019 в 10:54
поделиться

Я думаю, что лучший способ:

class Memoized(object):
    def __init__(self,func):
        self.cache = {}
        self.func = func
    def __call__(self,*args):
        if args in self.cache: return cache[args]
        else:
            self.cache[args] = self.func(*args)
            return self.cache[args]
0
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

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