Можем ли мы иметь назначение в состоянии?



возможно ли иметь назначение в состоянии?



например.



if (a=some_func()):
# Use a
332   7  

7 ответов:

почему бы не попробовать?

>>> def some_func():
...   return 2
... 
>>> a = 2
>>> if (a = some_func()):
  File "<stdin>", line 1
    if (a = some_func()):
          ^
SyntaxError: invalid syntax
>>> 

Так, нет.

нет, BDFL не понравилась эта функция.

с того места, где я сижу, Гвидо ван Россум, "доброжелательный диктатор на всю жизнь", изо всех сил боролся за то, чтобы питон был настолько простым, насколько это возможно. Мы можем спорить с некоторыми решениями, которые он принял - я бы предпочел, чтобы он говорил " Нет " чаще. Но тот факт, что не было комитета, разрабатывающего Python, а вместо этого доверенный "консультативный совет", основанный в основном на заслугах, фильтруя через один чувствительность конструктора, производила чертовски хороший язык, ИМХО.

http://docs.python.org/tutorial/datastructures.html

обратите внимание, что в Python, в отличие от C, назначение не может произойти внутри выражения. C программисты могут ворчать об этом, но он избегает общего класс проблем, возникающих в связи с программы: ввод = в выражении когда = = было задумано.

также смотрите:

http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm

не напрямую, в это мой старый рецепт -- но, как говорится в рецепте, легко построить семантический эквивалент, например, если вам нужно транслитерировать непосредственно из 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

кстати, очень идиоматическая Питоническая форма для вашего конкретного случая, если вы точно знаете, какое ложное значение somefunc может вернуться, когда он возвращает ложное значение (например,0), это

for a in iter(somefunc, 0):
  # use a

так что в этом конкретном случае рефакторинг будет довольно легко; -).

если возвращение может быть любой вид ложного значения (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-это оператор, а не выражение.

одна из причин, почему назначения являются незаконными в условиях, что это легче сделать ошибку и назначить 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)

Comments

    Ничего не найдено.