2017-02-27 29 views
1

我正在嘗試以下操作;如何返回locals(),然後在另一個函數中重新定義它們?

def a(): 
    a = ... 
    b = ... 
    ... 
    n = ... 

    return locals() 

def b(**kwargs): 
    """Some function that would assign all keys and values in this function""" 
    print(a) 
    print(d) 

if __name__=="__main__": 
    b(**a()) 

我的變量一個長長的清單,我想這樣做,而不是做

def a(): 
    a = ... 
    b = ... 
    ... 
    n = ... 

    return a,b,c,d,e ... n 

def b(a,b,c,d,e ... n): 
    print(a) 
    print(d) 

if __name__=="__main__": 
    a,b,c,d,e ... n = a() 
    b(a,b,c,d,e,f ... n) 

我試着execlocals().update(dict)擺弄周圍以上,但這些都沒有爲我工作。

+5

有什麼理由不能在'b'中使用'kwargs ['a']'? –

+0

'b'已經寫好。我將不得不通過並將'b'中的每個變量都更改爲'kwargs ['n']'。這可以起作用,但似乎並不是實現這一目標的最佳方式。我寧願在'b'簽名或其前幾行添加一些東西。 – p014k

+1

[python從字典條目創建變量]可能的重複(http://stackoverflow.com/questions/22675221/python-create-variables-from-dictionary-entries) – DyZ

回答

2

從Python 3開始,exec語句不再可用作在函數中創建實際本地字典的一種方式。這意味着不再有一種方法可以在函數中創建局部變量而不必明確命名它們。如果您希望使用大量未命名的參數,則可能需要將它們從kwargs作爲字典項引用。雖然您的評論表明,改寫b作爲

def b(**kwargs): 
    print(kwargs['a']) 
    print(kwargs['d']) 

可能會有很多的前期工作,它可能會是值得的結束。即使使用@das-g的出色答案,您仍然必須明確地寫出您想要使用的所有名稱。

如果b是您的kwargs字典的最後一個停止點,則應考慮使用@das-g's approach並列出明確需要的參數。這提高了清晰度,並使文檔和註釋更容易一些。

如果您打算將kwargsb轉移到其他功能,列出參數將有效地將它們從kwargs中刪除,因此您應該使用上述方法。

+2

確實。這聽起來很矛盾:如果函數太大而不能被重寫,那麼它太大了。因此應該重寫。 –

+0

@ das-g。我認爲你只是發現了一個矛盾的方式來說出一個非常合理的原則:) –

1

這工作:在函數簽名明確聲明

def a(): 
    a = 1 
    b = 2 
    c = 3 
    d = 4 
    e = 5 
    return locals() 

def b(*, a, d, **kwargs): # explicitly declare key word arguments you care about 
    print(a) 
    print(d) 

b(**a()) 
# Prints 
# 1 
# 4 

關鍵字參數將被代替爲kwargs項下的函數內的相應名稱的局部變量可用。 **kwargs仍然是必需的,以便該函數可以接受字典條目的其餘部分作爲更多的關鍵字參數(如果kwargs未在函數中使用,它將高興地忽略)。

在顯式關鍵字參數前面的*,使它們不被用作位置參數。如果你不想要這個限制,那麼省略*,

+0

你能解釋你的答案嗎? –

+0

其中一個目標是消除在'b' – p014k

+1

@ p014k的簽名中明確聲明我關心的每個參數的需要。爲什麼?如果你正在使用所有參數,爲什麼不把它們列出來。如果沒有別的東西,它會讓事情更加明確。此外,它允許您更好地記錄輸入。 –

相關問題