Python的locals()函数

枫铃3年前 (2021-06-26)Python261

Python的locals()函数会以dict类型返回当前位置的全部局部变量。

示例代码:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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结合提高代码可读性

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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装饰器。

相关文章

Python Selenium 常用方法总结

selenium Python 总结一些工作中可能会经常使用到的API。 1.获取当前页面的Url 方法:current_url 实例&...

Python3 动态导入模块的两种方式

Python3 动态导入模块的两种方式

动态导入模块就是只知道s...

python异常处理及内置模块

python异常处理及内置模块

异常处理 有时候我们在...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。