Python的locals()函數


Python的locals()函數會以dict類型返回當前位置的全部局部變量。

示例代碼:

def func():
    arg_a, arg_b = 'a', 'b'

    def func_a():
        pass

    def func_b():
        pass

    def print_value():
        print(arg_a, arg_b)

    return locals()


if __name__ == '__main__':

    args = func()
    print(type(args))
    print(args)

運行結果可以看出,會將函數func的局部變量以dict類型返回。

<class 'dict'>
{'func_a': <function func.<locals>.func_a at 0x10d8f71e0>, 'arg_b': 'b', 'arg_a': 'a', 'print_value': <function func.<locals>.print_value at 0x10d8f7378>, 'func_b': <function func.<locals>.func_b at 0x10d8f72f0>}

將locals()與property結合提高代碼可讀性

class NewProps(object):

    def __init__(self):
        self._age = 40

    def fage():
        doc = "The age property."

        def fset(self, value):
            self._age = int(value)

        def fget(self):
            return self._age

        def fdel(self):
            del self._age

        return locals()

    age = property(**fage())

if __name__ == '__main__':
    x = NewProps()
    print(x.age)
    x.age = 50
    print(x.age)

這里需要注意的是fage()方法下4個屬性名稱不能修改(也不能新增其他屬性,除非對locals()返回的dict進行處理,移除多余的元素),必須為fset、fget、fdel、doc,如果修改屬性名稱,會拋出如下異常:

'f_set' is an invalid keyword argument for this function

因為,property的__init__方法接收4個參數(self除外,因為Python編譯器會自動把self傳入)

def __init__(self, fget=None, fset=None, fdel=None, doc=None): # known special case of property.__init__
  .....

在return locals()時,返回dict,key的值和參數的name一一對應,以**kwargs參數的形式傳入property的__init__方法。

當然,更好的方法是使用property裝飾器。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM