Что такое Python-эквивалент статических переменных внутри функции?

Вопрос старый, но до тех пор, пока не будет использована последняя версия oracle, это все еще правильный вопрос.

Я бы решил проблему следующим образом: Создайте таблицу, которая содержит возможные значения для true / false плюс локализованный текст дисплея fe T $ KEYWORDS ITEMNO ITEMTEXT ITEMTEXT_DE ITEMTEXT_FE ... 0 False Falsch 1 True Wahr

Вместо True / False это может быть также выбрано, не выбрано и т. Д.

. Затем добавьте toeigh ключ к вашей колонке к этой таблице. Таким образом, у вас есть только допустимые значения, и они не меняются с локализацией.

Другое хорошее решение imho использует ограничение проверки в столбце данных. Этот параметр cc не работает, если ваши значения могут отличаться в одной и той же базе данных / столбце в зависимости от локализации клиентов.

alter table tblLocations add flag number CONSTRAINT <constraintname> CHECK (flag IN (1,0));

552
задан Rakete1111 8 January 2019 в 11:20
поделиться

6 ответов

Немного инвертированный, но это должно работать:

def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
foo.counter = 0

, Если Вы хотите встречный код инициализации наверху вместо нижней части, можно создать декоратора:

def static_var(varname, value):
    def decorate(func):
        setattr(func, varname, value)
        return func
    return decorate

Тогда используют код как это:

@static_var("counter", 0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

Это все еще потребует, чтобы Вы использовали foo. префикс, к сожалению.

<час>

РЕДАКТИРОВАНИЕ (благодаря ony): Это выглядит еще более хорошим:

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(counter=0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
617
ответ дан Community 8 January 2019 в 11:20
поделиться
_counter = 0
def foo():
   global _counter
   _counter += 1
   print 'counter is', _counter

Python обычно использует подчеркивания для указания на частные переменные. Единственная причина в C для объявления статической переменной в функции состоит в том, чтобы скрыть его вне функции, которая не является действительно идиоматическим Python.

6
ответ дан Dave 8 January 2019 в 11:20
поделиться

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

class Foo(object):
  # Class variable, shared by all instances of this class
  counter = 0

  def __call__(self):
    Foo.counter += 1
    print Foo.counter

# Create an object instance of class "Foo," called "foo"
foo = Foo()

# Make calls to the "__call__" method, via the object's name itself
foo() #prints 1
foo() #prints 2
foo() #prints 3

Примечание, что __call__ делает экземпляр класса (объект) вызываемый его собственным именем. Вот почему звоня foo() выше вызовов метод класса __call__. Из документации :

Экземпляры произвольных классов могут быть сделаны вызываемыми путем определения __call__() метод в их классе.

24
ответ дан Community 8 January 2019 в 11:20
поделиться

Используйте функцию генератора для генерации итератора.

def foo_gen():
    n = 0
    while True:
        n+=1
        yield n

Тогда использование это как

foo = foo_gen().next
for i in range(0,10):
    print foo()

, Если Вы хотите верхний предел:

def foo_gen(limit=100000):
    n = 0
    while n < limit:
       n+=1
       yield n

, Если итератор завершается (как пример выше), можно также циклично выполниться по нему непосредственно, как

for i in foo_gen(20):
    print i

, Конечно, в этих простых случаях, лучше использовать xrange:)

Вот документация относительно оператор .

урожая
14
ответ дан gnud 8 January 2019 в 11:20
поделиться

Можно добавить атрибуты к функции и использовать ее в качестве статической переменной.

def myfunc():
  myfunc.counter += 1
  print myfunc.counter

# attribute must be initialized
myfunc.counter = 0

, С другой стороны, если Вы не хотите устанавливать переменную вне функции, можно использовать hasattr() для предотвращения AttributeError исключение:

def myfunc():
  if not hasattr(myfunc, "counter"):
     myfunc.counter = 0  # it doesn't exist yet, so initialize it
  myfunc.counter += 1

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

200
ответ дан sarnold 8 January 2019 в 11:20
поделиться

Другие ответы продемонстрировали способ, которым необходимо сделать это. Вот способ, которым Вы не были должны:

>>> def foo(counter=[0]):
...   counter[0] += 1
...   print("Counter is %i." % counter[0]);
... 
>>> foo()
Counter is 1.
>>> foo()
Counter is 2.
>>> 

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

39
ответ дан Jeremy Banks 8 January 2019 в 11:20
поделиться
Другие вопросы по тегам:

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