【问题标题】:What data type should my widgets accept/return?我的小部件应该接受/返回什么数据类型?
【发布时间】:2010-07-02 21:04:49
【问题描述】:

我正在 python 中构建一个表单类,用于生成和验证 HTML 表单。每个字段都有一个关联的小部件,用于定义字段的呈现方式。

创建小部件时,它会传入一个(默认)值,以便它知道在第一次渲染时要显示什么。提交表单后,小部件被要求输入值。我将此委托给小部件,而不是仅仅从 POST 数据中获取它,因为小部件可能包含多个 HTML 输入(想想月/日/年选择器)。只有小部件知道如何将这些组合成一个值。

问题是,我不知道我是否应该让小部件始终接受字符串,并始终返回字符串以保持一致性,或者接受并返回与其目的一致的数据类型(即,日期选择器可能应该返回一个 DateTime 对象)。

我的表单课程背后的理念是“混搭”。你选择你想要的小部件,以及你想在上面运行的验证器/格式化程序/转换器。我想这有助于“使用字符串”并让开发人员决定数据类型后记,但是......我想不出一个好的但是。您预计这种方法会出现什么问题吗?

【问题讨论】:

    标签: python design-patterns


    【解决方案1】:

    虽然简单地传递字符串似乎是一个有用的想法,但我认为您会发现它并不像您希望的那样工作。

    考虑一下日期示例 - 不是传递 date 对象,而是传递格式为 "2010-01-01"str。为了使用该数据,该类的每个用户不仅需要知道它是代表datestr,还需要知道该字符串的格式是什么。换句话说,你没有得到任何东西。更糟糕的是,您无法将 datetime 对象传递到小部件(除非您采取额外步骤来处理这种情况)。

    验证器或格式化程序问题并不像您想象的那么重要;您要多久验证一次不代表日期的字符串,就好像它是日期一样?

    【讨论】:

    • 所以您建议所有日期小部件都应该接受日期时间对象?我想他们也应该返回 datetime 对象?因此验证器......不是真的需要,因为值已经是正确的格式?您是对的,您不想将非日期字符串表示为日期,但是如果开发人员想要使用纯文本输入小部件作为日期呢?然后小部件必须返回一个字符串,因为它并不真正知道正在输入什么,然后它确实需要被正确验证。当然,开发者可以省略前者中的验证器...
    • ...case,但在第二种情况下添加。但是现在我们正在产生不一致,这可能会使事情进一步复杂化?如果开发人员从日期的纯文本小部件开始,因此默认参数需要是一个字符串,然后决定用实际的日期小部件切换它,但忘记将默认参数更新为日期时间对象怎么办?我可以看到双方......这就是为什么这是一个艰难的决定:(
    • 这是 Python,所以日期小部件应该接受任何看起来像日期的东西,并返回一个日期。我假设小部件将采用表单输入并创建有效日期(或引发错误)。如果您想对日期使用纯文本小部件,我只需从常规文本小部件继承并添加处理日期的魔法(前端验证可能是其中的一部分)。
    • 如果开发人员忘记更新默认参数,您将在第一次运行代码时遇到异常。这不会是一个问题。
    • 您可以轻松地将错误设为ValidationError。只需将整个函数包装在 try/catch 块中,然后使用您自己设计的 ValidationError 重新包装任何意外异常。你甚至可以把它做成一个装饰器,它会让你的代码保持整洁。但我认为你会发现这是不必要的;这些不是生产中出现的那种错误——你可以确定传递了什么,传递错误的类型非常罕见(当你这样做时很容易检测和纠正),你不需要特别强大的错误处理。
    【解决方案2】:

    这种方法非常通用,并且在字符串之间进行序列化应该始终可以正常工作。您还可以将小部件的状态保存到文件中,或通过网络发送它以从中重新创建另一个小部件。

    需要考虑的一些潜在问题或方面:

    • 本地化:如何解释有关文化的字符串,哪种格式是规范格式进行比较。
    • 性能:某些转换可能会很耗时,但我认为对于人机交互来说已经足够快了。

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多