【问题标题】:Is there a better way to share variables between modules?有没有更好的方法在模块之间共享变量?
【发布时间】:2021-11-04 00:09:47
【问题描述】:

我现在正在制作一个包,我希望人们可以直接调用这个包,所以我使用 setup.py 中的入口点。

现在我有 application.py,其中包含 main() 作为入口点。 这个 main() 函数中的变量被发送到 tex.py,它可以帮助我生成乳胶报告。 (latex文件的生成方式来源于:Generating pdf-latex with python script

# application.py
def main():
    a = 123
    b = 456
    from tex import generate
    generate()

#tex.py
content = f'{a} is not equal to {b}'
def generate():
    with open('report.tex','w') as f:
        f.write(content)

但这会导致 alb 未定义。

我发现一种解决方案是使用global 并添加from application import * 但是因为我有几十个变量,所以太长了。

我想知道是否有办法将变量共享给我的乳胶生成器并保留这个入口点功能。

提前致谢。

【问题讨论】:

  • 您可以创建一个全局命名空间(可能是dataclass)并将所有变量放在其中。您也可以使用下划线开始类名以将其标记为私有,然后创建此数据类的单例变量,该变量可以在模块之间共享。这种方法不需要使用global
  • 最好的方法是明确地向generate提供参数
  • @rv.kvetch 为什么不只是一个常规模块?
  • 嗯,不确定我是否在关注你
  • 哦,好吧,如果我理解正确的话,OP提到他有很多变量,所以他想避免长时间的导入

标签: python python-3.x command-line-interface pypi entry-point


【解决方案1】:

像@juanpa.arrivilaga 和@rv.kvetch 建议为什么不直接传递参数?

# application.py
def main():
  a = 123
  b = 456
  from tex import generate
  generate(a, b)

#tex.py
def generate(a, b):
  content = f'{a} is not equal to {b}'
  with open('report.tex','w') as f:
    f.write(content)

或者,如果您有很多变量,请创建一个模型并传递它

class Model:
  __init__(a,b,c,d):
     self.a = a
     ....

    # application.py
def main():
  a = 123
  b = 456
  from tex import generate
  generate(Model(a,b))

#tex.py
def generate(model):
  content = f'{model.a} is not equal to {model.b}'
  with open('report.tex','w') as f:
    f.write(content)

更好的是,您可以将打印逻辑添加到模型本身(使用一些相关的方法),有很多解决方案!

class Model:
   ...init
    def __str__(self):
      return '{} is not equal to {}'.format(self.a, self.b)

    def __repr__(self):
      return '{} is not equal to {}'.format(self.a, self.b)

【讨论】:

  • 是的,这些都是很好的解决方案。我想知道是否有更有效或更聪明的方法,因为这是我第一次编写包。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2019-08-17
  • 2023-02-03
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多