美文网首页
对 Python 等动态语言的进一步认知

对 Python 等动态语言的进一步认知

作者: 武曌思 | 来源:发表于2019-08-01 23:41 被阅读0次

    起因

    Django 的 django.forms.BooleanField 不能传递 false,如果想传,必须加上 required=False。

    但这样就和参数的必需性混了。


    过程

    查看 BooleanField 源码

        def to_python(self, value):
            """Returns a Python boolean object."""
            # Explicitly check for the string 'False', which is what a hidden field
            # will submit for False. Also check for '0', since this is what
            # RadioSelect will provide. Because bool("True") == bool('1') == True,
            # we don't need to handle that explicitly.
            if isinstance(value, six.string_types) and value.lower() in ('false', '0'):
                value = False
            else:
                value = bool(value)
            return super(BooleanField, self).to_python(value)
    
        def validate(self, value):
            if not value and self.required:
                raise ValidationError(self.error_messages['required'], code='required')
    

    主要是 validate 函数中,false 会触发 not value,所以才不能传 false。


    解决方法

    我可以动态的修改 BooleanField 的方法,参考了 django.forms.NullBooleanField 的实现,如下:

    from django.core.exceptions import ValidationError
    
    from django.forms import BooleanField
    
    
    def to_python(self, value):
        if value in (True, 'True', 'true', '1'):
            return True
        elif value in (False, 'False', 'false', '0'):
            return False
        else:
            return None
    
    
    def validate(self, value):
        if value is None and self.required:
            raise ValidationError(self.error_messages['required'], code='required')
    
    
    print('修复 django.forms.BooleanField 不能传 FALSE 的 bug')
    BooleanField.to_python = to_python
    BooleanField.validate = validate
    
    

    认知

    • 动态语言和动态类型语言,静态语言和静态类型语言
      • 动态语言:程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。(摘自百度百科)
      • 动态类型语言:在运行期检查变量类型的语言,编写代码的时候可以不指定变量的数据类型;变量没有类型,而值有类型。
      • 一个关注的是结构的变化,一个关注的是(变量)类型的变化
    • 对于动态语言,可以在不修改源码的基础上,进行功能的修改。

    相关文章

      网友评论

          本文标题:对 Python 等动态语言的进一步认知

          本文链接:https://www.haomeiwen.com/subject/yhttrctx.html