2016-02-22 2 views
0

Есть ли более быстрый способ, чтобы написать это:Есть ли сокращение для использования той же переменной, которая назначается для аргумента в функции?

def foo(): 
    # What happens in here is irrelevant. 
    return new_value 

dict['i_dont_want_to_type_this_twice'] = foo(dict['i_dont_want_to_type_this_twice']) 

Как при использовании x += 1

+1

'k = 'i_dont_want_to_type_this_twice'; d [k] = foo (d [k]) ' – Alexander

+0

Вы можете заранее определить« ключ », а затем использовать« ключ »вместо длинной строки. – zondo

+0

Я вроде бы хотел избегать использования двух строк, но если для этого нет коротких рук, то две строки это. – Michael

ответ

1

Я не думаю, что есть какая-либо встроенная или стандартная функция библиотеки для этого. Самое идиоматическое, что нужно сделать, вероятно, определить свою собственную функцию-оболочку, такие как

def transform(d, k, f): 
    d[k] = f(d[k]) 

И затем использовать его как так (обратите внимание, что я переименовал ваш dict в mydict, чтобы избежать маскировки встроенной):

transform(mydict, 'i_dont_want_to_type_this_twice', foo) 

(я думаю apply() бы достойное название для этого, но это встроенный, если вы используете Python 2. Хотя это было устаревшим, начиная с 2.3, так что не будет много вреда в это.)

+0

Спасибо! Это ускорит многое для меня. Я даже не понял, что вы можете передать функцию в другую функцию, интересную ... – Michael

1

Вы можете сделать что-то вроде этого, с помощью update по словарю.

d.update(a=foo(d.get('a', 0))) 

Полное демо:

d = {'a': 5} 

def foo(val): 
    val += 100 
    return val 

d.update(a=foo(d.get('a', 0))) 

print(d) # outputs {'a': 105} 

Из описания словаря update метода:

  • D.update ([E,] ** F) -> None. Обновить D из dict/iterable E и F.
  • Если E присутствует и имеет метод .keys(), то делает: для k в E: D [k] = E [k]
  • Если E присутствует и не имеет метода .keys(), то делает: для k, v в E: D [k] = v
  • В любом случае за этим следует: для k в F: D [k] = F [k ]

Итак, если ключ существует, он обновит его, а если нет, он его создаст.

+0

Это, вероятно, так близко, как вы добираетесь до '+ =' с помощью dict. Но все же реплицирует имя ключа в arg на 'foo()' (который в вашем ответе опущен). – PaulMcG

+0

@PaulMcGuire Хороший звонок. Я обновил, чтобы включить более точное представление проблемы ОП. – idjaw

+0

Я что-то упустил? Имя ключа все еще записывается дважды. 'd.update (i_dont_want_to_write_this_twice = foo (d.get ('i_dont_want_to_write_this_twice', 0)))' – Michael

1

Как насчет этого для однострочного задания?

dict.update({key: foo(dict[key]) for key in ['i_dont_want_to_type_this_twice']}) 

Или, чтобы обновить весь Dict:

dict = {k: foo(v) for k, v in dict.items()} 
Смежные вопросы