首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将代码从问题块抽象到模块

将代码从问题块抽象到模块
EN

Stack Overflow用户
提问于 2021-03-20 17:24:45
回答 2查看 62关注 0票数 0

我有一个工作面试(耶!),我正在努力重构它。我正在试图找出将我的code块移动到.py文件中的好方法。特别是,我担心的是要维护docassemble所做的一些花哨的事情(例如,我正在考虑的特定code块被标记为initial: True )。

其想法是将code块所做的任何事情转换为函数,然后以一种使用这些函数的方式分配docassemble正在寻找的变量吗?想必这些函数的结果仍然需要在code块中处理?

下面的方法大致正确吗(下面的代码)?我假设:

如果A

  • Variables未定义,则
  1. 试图按下面的方式运行Bcode.func(A ...),将触发必要的异常,以导致docassemble搜索设置Bcode.func(A ...)所需的问题。

这些假设是否正确/不正确?

所以..。

如果这是我的questions.yml文件:

代码语言:javascript
复制
---
question: A?
yesno: A
---
# code setting value of B
---
code: |
    if A:
         answer = "A"
    elif B:
         answer = "B"
    else:
         answer = "C"
---

为了抽象出代码,我想我可能会这样做?

questions.yml

代码语言:javascript
复制
---
imports:
    - Bcode
---
question: A?
yesno: A
---
initial: True
code: |
    answer = Bcode.func(A, *args_to_set_value_of_B)
---

Bcode.py

代码语言:javascript
复制
---
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"
---
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-20 19:01:41

如果你这样做了

代码语言:javascript
复制
modules:
  - .Bcode

然后docassemble将运行(实际上):

代码语言:javascript
复制
exec("from docassemble.yourpackage.Bcode import *", user_dict)

其中user_dict是面试答案( YAML文件中的Python名称空间)。这将使访问名称func在您的访问名称空间中可用,以便它可以用于code块、Mako模板等。

您的initial块将引发异常,因为Bcode不是面试回答中的名称。

func()为真时,函数b总是会引发异常,因为b没有在func()的命名空间中定义。

Docassemble的工作方式是捕获NameErrorIndexErrorAttributeError异常,然后寻找一个questioncode块来定义任何未定义的变量。NameError异常适用于任何类型的变量,但IndexErrorAttributeError异常仅适用于DAObject实例或其子类。

当您将代码移到模块文件中时,重要的是确保模块文件中的代码不会引发NameError异常,因为这些异常将导致混淆;docassemble将尝试在“面试回答”命名空间中定义变量,但这将永远不会修复模块内的问题,因为不管发生什么事情,该名称都将在模块中未定义。但是,模块文件中的代码可以安全地在已从面试命名空间传递到模块命名空间的IndexError变量和AttributeError变量上引发错误,因为当docassemble定义了面试应答命名空间中的这些变量时,模块内部也将提供这些定义。

票数 2
EN

Stack Overflow用户

发布于 2021-03-20 19:22:54

我将避免将代码移动到一个没有清晰界面的模块中。在YAML中包含访问逻辑的代码块是完全合适的。我为可重用的抽象代码保留模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66724484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档