如何在不使用全局变量的情况下重构工作?

2024-05-02 16:45:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个项目的一部分,我正在工作的工作解决方案。然而,在不使用全局变量的情况下,很难找到使事情按我所希望的方式运行的方法

我将我的工作复制如下:

x_age = ''
x_name = ''

def find_info(x, y):
    global x_age
    global x_name
    x = 'Joseph'
    y = '23'
    x_name = x
    x_age = y

def main():
    find_info(x_name, x_age)
    print('name is ' + x_name)
    print('age is ' + x_age)

main()

我的目标是将在find_info()内进行的赋值传递回相应的变量(x_name && x_age

我发现的一个工作环境如下所示:

def find_info():
    x = 'Joseph'
    y = '23'
    return x, y

def main():
    x_name, x_age = find_info()
    print('name is ' + x_name)
    print('age is ' + x_age)

main()

使用这个解决方案将意味着重构我代码的许多其他部分,如果我能帮助的话,我宁愿不重构。因此,我正在寻找一些关于如何在不使用global的同时将x_name && x_age传递给find_info()的情况下实现我想要的结果(如上所述)的指导原则


Tags: 项目nameinfoageismaindef情况
2条回答

根据您的实际工作,对类执行OOP可能是一个解决方案。我不建议使用类,除非您要在类中操作类中保存的数据

对于一个简单的数据容器,dict可能是一个更好的解决方案,并且是一种更具python风格的方法

$ cat foo.py
def find_info(person):
    person['name'] = 'Joseph'
    person['age'] = 42

def main():
    person = { 'name': 'John', 'age': 42 }
    print(f'person before calling find_info(): {person}')
    find_info(person)
    print(f'person after calling find_info(): {person}')


if __name__ == '__main__':
    main()

这导致:

$ python foo.py
person before calling find_info(): {'name': 'John', 'age': 42}
person after calling find_info(): {'name': 'Joseph', 'age': 42}

其他数据结构,比如NamedTuples,可能比这更方便。这完全取决于你想做什么

有一点是肯定的:这里不需要全局变量

你知道吗?如果不是,你应该学习它。这样就容易了

class Person:
  def __init__(self,name="",age=""):
    self.name=name
    self.age=age

def find_info(obj):
    x = 'Joseph'
    y = '23'
    obj.name = x
    obj.age = y

def main():
    x=Person()
    find_info(x)
    print('name is ' + x.name)
    print('age is ' + x.age)

在这里,您可以根据需要多次重用Person类,如:


y=Person('me','18')
print("name:",y.name) #prints name:me

或者更好,您可以定义Person类的方法。你可以做x.find_info()

相关问题 更多 >