我有一个工作面试(耶!),我正在努力重构它。我正在试图找出将我的code块移动到.py文件中的好方法。特别是,我担心的是要维护docassemble所做的一些花哨的事情(例如,我正在考虑的特定code块被标记为initial: True )。
其想法是将code块所做的任何事情转换为函数,然后以一种使用这些函数的方式分配docassemble正在寻找的变量吗?想必这些函数的结果仍然需要在code块中处理?
下面的方法大致正确吗(下面的代码)?我假设:
如果A
Bcode.func(A ...),将触发必要的异常,以导致docassemble搜索设置Bcode.func(A ...)所需的问题。这些假设是否正确/不正确?
所以..。
如果这是我的questions.yml文件:
---
question: A?
yesno: A
---
# code setting value of B
---
code: |
if A:
answer = "A"
elif B:
answer = "B"
else:
answer = "C"
---为了抽象出代码,我想我可能会这样做?
questions.yml
---
imports:
- Bcode
---
question: A?
yesno: A
---
initial: True
code: |
answer = Bcode.func(A, *args_to_set_value_of_B)
---Bcode.py
---
def func(a, *args_to_set_value_of_b):
# code computing value of b
if a:
return "A"
elif b:
return "B"
else:
return "C"
---发布于 2021-03-20 19:01:41
如果你这样做了
modules:
- .Bcode然后docassemble将运行(实际上):
exec("from docassemble.yourpackage.Bcode import *", user_dict)其中user_dict是面试答案( YAML文件中的Python名称空间)。这将使访问名称func在您的访问名称空间中可用,以便它可以用于code块、Mako模板等。
您的initial块将引发异常,因为Bcode不是面试回答中的名称。
当func()为真时,函数b总是会引发异常,因为b没有在func()的命名空间中定义。
Docassemble的工作方式是捕获NameError、IndexError和AttributeError异常,然后寻找一个question或code块来定义任何未定义的变量。NameError异常适用于任何类型的变量,但IndexError和AttributeError异常仅适用于DAObject实例或其子类。
当您将代码移到模块文件中时,重要的是确保模块文件中的代码不会引发NameError异常,因为这些异常将导致混淆;docassemble将尝试在“面试回答”命名空间中定义变量,但这将永远不会修复模块内的问题,因为不管发生什么事情,该名称都将在模块中未定义。但是,模块文件中的代码可以安全地在已从面试命名空间传递到模块命名空间的IndexError变量和AttributeError变量上引发错误,因为当docassemble定义了面试应答命名空间中的这些变量时,模块内部也将提供这些定义。
发布于 2021-03-20 19:22:54
我将避免将代码移动到一个没有清晰界面的模块中。在YAML中包含访问逻辑的代码块是完全合适的。我为可重用的抽象代码保留模块。
https://stackoverflow.com/questions/66724484
复制相似问题