Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.
Иногда вы можете просто забыть инициализировать .
Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.
Почему бы не попробовать?
>>> def some_func():
... return 2
...
>>> a = 2
>>> if (a = some_func()):
File "<stdin>", line 1
if (a = some_func()):
^
SyntaxError: invalid syntax
>>>
Итак, нет.
Не прямо, за этот старый мой рецепт - но, как говорится в рецепте, легко построить семантический эквивалент, например. если вам нужно транслитерировать непосредственно из C-кодированного эталонного алгоритма (до рефакторинга на более -диоматический Python, конечно ;-). Т.е.:
class DataHolder(object):
def __init__(self, value=None): self.value = value
def set(self, value): self.value = value; return value
def get(self): return self.value
data = DataHolder()
while data.set(somefunc()):
a = data.get()
# use a
BTW, очень идиоматическая питоническая форма для вашего конкретного случая, если вы точно знаете, какое значение falsish somefunc
может вернуться, когда оно вернет значение фальшивости (например, 0
),
for a in iter(somefunc, 0):
# use a
, поэтому в этом конкретном случае рефакторинг будет довольно простым; -).
Если return может быть любым значением falsish (0, None
, ''
, ...), одна из возможностей:
import itertools
for a in itertools.takewhile(lambda x: x, iter(somefunc, object())):
# use a
, но вы можете предпочесть простой пользовательский генератор:
def getwhile(func, *a, **k):
while True:
x = func(*a, **k)
if not x: break
yield x
for a in getwhile(somefunc):
# use a
Нет. Назначение в Python - это выражение, а не выражение.
http://docs.python.org/tutorial/datastructures.html
Обратите внимание, что в Python, в отличие от C, присваивание не может происходить внутри выражений. Программисты C могут ворчать об этом, но он избегает общего класса проблем, встречающихся в программах на C: typing = в выражении, когда == был предназначен.
blockquote>также см .:
http://effbot.org/pyfaq/why-can-ti-use-an-assignment-in-an-expression.htm
Нет, BDFL не понравилась эта функция.
С того места, где я сижу, Guido van Rossum, «Benevolent Dictator For Life», изо всех сил старался держать Python настолько простым, насколько это возможно. Мы можем спорить с некоторыми из решений, которые он принял, - я бы предпочел, чтобы он говорил «Нет» чаще, но тот факт, что не было комитета, проектирующего Python, а вместо этого доверенный «консультативный совет», основанный в основном по заслугам, фильтруя через одно чувства дизайнера, произвел один адский приятный язык, ИМХО.
if let
, когда у меня есть цепочка if elif, но вам нужно хранить и использовать значение условия в каждом случае.
– Thayne
10 July 2018 в 04:57
Одна из причин, по которой присвоения являются незаконными в условиях, состоит в том, что легче совершить ошибку и назначить True или False:
some_variable = 5
# This does not work
# if True = some_variable:
# do_something()
# This only works in Python 2.x
True = some_variable
print True # returns 5
В Python 3 True и False являются ключевыми словами, поэтому больше никакого риска .
Вы можете определить функцию для назначения для вас:
def assign(name, value):
import inspect
frame = inspect.currentframe()
try:
locals_ = frame.f_back.f_locals
finally:
del frame
locals_[name] = value
return value
if assign('test', 0):
print("first", test)
elif assign('xyz', 123):
print("second", xyz)
x = x + 1
требует дополнительного времени поиска, аx += 1
был несколько быстрее, но я уверен, что ему даже не нравилось делать , что < / i> много. :-) – wescpy 9 April 2010 в 00:56