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

时间:2020-01-07 18:15:32

标签: 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()的情况下实现所需结果的准则(如上所述)。

2 个答案:

答案 0 :(得分:2)

你知道OOP吗?如果不是,您应该学习它。这样变得更容易。

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()

答案 1 :(得分:1)

根据您的实际工作,对类进行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可能比这更方便。这完全取决于您要做什么。

可以肯定的是:这里不需要全局变量。