Вопрос старый, но до тех пор, пока не будет использована последняя версия 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));
Немного инвертированный, но это должно работать:
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
_counter = 0 def foo(): global _counter _counter += 1 print 'counter is', _counter
Python обычно использует подчеркивания для указания на частные переменные. Единственная причина в C для объявления статической переменной в функции состоит в том, чтобы скрыть его вне функции, которая не является действительно идиоматическим Python.
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__()
метод в их классе.
Используйте функцию генератора для генерации итератора.
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:)
Вот документация относительно оператор .
урожаяМожно добавить атрибуты к функции и использовать ее в качестве статической переменной.
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
Так или иначе статические переменные довольно редки, и необходимо найти лучшее место для этой переменной, скорее всего, в классе.
Другие ответы продемонстрировали способ, которым необходимо сделать это. Вот способ, которым Вы не были должны:
>>> def foo(counter=[0]):
... counter[0] += 1
... print("Counter is %i." % counter[0]);
...
>>> foo()
Counter is 1.
>>> foo()
Counter is 2.
>>>
Значения по умолчанию инициализируются только, когда функция сначала оценена, не каждый раз, когда она выполняется, таким образом, можно использовать список или любой другой изменяемый объект сохранить статические значения.