相當於PHP的compact()和extract()


2 Answers

恐怕Python中沒有等價物。 在某種程度上,你可以使用(和傳遞) locals模擬他們的效果:

>>> def compact(locals, *keys):
...     return dict((k, locals[k]) for k in keys)
...
>>> a = 10
>>> b = 2
>>> compact(locals(), 'a', 'b')
{'a': 10, 'b': 2}

>>> def extract(locals, d):
...     for k, v in d.items():
...         locals[k] = v
...
>>> extract(locals(), {'a': 'foo', 'b': 'bar'}
>>> a
'foo'
>>> b
'bar'

不過,我不認為這些功能“非常方便”。 動態的全局/局部變量是邪惡和容易出錯的 - PHP傢伙了解到,當他們勸阻register_globals。 根據我的經驗,很少有經驗的PHP程序員或主要框架使用compact()extract()

在Python中, 顯式比隱式更好

a = 1
b = 2
# compact
c = dict(a=a, b=b)

# extract
a, b = d['a'], d['b']
Question

compact ()和extract ()是PHP中的函數,我發現非常方便。 compact()在符號表中獲取一個名稱列表,並僅用它們的值創建一個散列表。 提取相反。 例如,

$foo = 'what';
$bar = 'ever';
$a = compact('foo', 'bar');
$a['foo']
# what
$a['baz'] = 'another'
extract(a)
$baz
# another

有沒有辦法在Python中做同樣的事情? 我已經看了四周,最近的是這個線程 ,似乎在皺眉。

我知道本地人(),全局變量()和變量(),但我怎樣才能輕鬆地選擇他們的值的一個子集?

Python是否有更好的東西來避免這種需求?




可以locals()函數做到這一點(雖然我只是建議不要...),它返回一個可更新的dict 。 例:

$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
>>> locals().update({'derek':'anderson'})
>>> derek
'anderson'
>>> 

所以locals()將是“compact all”,而locals().update()將被extract

祝你好運!




Python中的Python緊湊函數(適用於2.6;不能保證與Python的早期版本一起使用):

import inspect
def compact(*args):
    return dict([(i, inspect.currentframe().f_back.f_locals.get(i, None)) 
                  for i in args])

我已經寫了更多的關於這個: Python可以和PHP一樣醜陋






Related