對 Python 等動態(tài)語言的進一步認知


起因

Django 的 django.forms.BooleanField 不能傳遞 false,如果想傳,必須加上 required=False。

但這樣就和參數(shù)的必需性混了。


過程

查看 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 函數(shù)中,false 會觸發(fā) not value,所以才不能傳 false。


解決方法

我可以動態(tài)的修改 BooleanField 的方法,參考了 django.forms.NullBooleanField 的實現(xiàn),如下:

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


認知

  • 動態(tài)語言和動態(tài)類型語言,靜態(tài)語言和靜態(tài)類型語言
    • 動態(tài)語言:程序在運行時可以改變其結(jié)構(gòu):新的函數(shù)可以被引進,已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化。(摘自百度百科)
    • 動態(tài)類型語言:在運行期檢查變量類型的語言,編寫代碼的時候可以不指定變量的數(shù)據(jù)類型;變量沒有類型,而值有類型。
    • 一個關(guān)注的是結(jié)構(gòu)的變化,一個關(guān)注的是(變量)類型的變化
  • 對于動態(tài)語言,可以在不修改源碼的基礎(chǔ)上,進行功能的修改。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Django 準備 “虛擬環(huán)境為什么需要虛擬環(huán)境:到目前位置,我們所有的第三方包安裝都是直接通過 pip inst...
    33jubi閱讀 1,390評論 0 5
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,120評論 1 3
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子,分析運行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,175評論 0 15
  • 老婆在朋友圈里曾經(jīng)分享過一句話:生活的本質(zhì)就是你要什么就不給你什么,生活的智慧就是你有什么就用好什么。后來在李笑來...
    范法匠閱讀 772評論 0 0
  • 本文參加#感悟三下鄉(xiāng),青春筑夢行#活動,本人承諾,文章內(nèi)容為原創(chuàng),且未在其他平臺發(fā)表過。 如果說世界是一棟建筑,那...
    HearT_5626閱讀 1,614評論 0 1

友情鏈接更多精彩內(nèi)容