問題描述
今天用Flask寫web項目時出現了一個問題:AttributeError: 'function' object has no attribute 'check',即在server.py中引用其他python文件失敗,不能調用其他python文件的函數。
2020/6/10。今天寫另一個flask項目,發現全局引用的文件,其函數也能在注冊路由中使用,那為什么之前就不行呢???
2020/6/11。我好像知道為啥了。。。可能是我把文件名和函數名寫重了,都用的check,哪個近就按哪個算?
解決方法
我一開始是在server.py開頭引入的python自定義模塊,然后在注冊路由的函數中使用自定義的函數,結果一直報AttributeError。百度搜索未發現解決方法(也可能是我的搜索關鍵詞沒用對?)。后來嘗試將引入自定義模塊的語句放到注冊路由的函數中、調用函數的語句前,發現正常運行。示例如下:
@app.route('/check') def check(): expression = request.args.get("expression", default="") import check result = check.checkExpression(expression) return result
結論
長個教訓,以后創建文件必須首字母大寫,以防止函數名跟文件名沖突。
如果在函數外引入了一個文件,就不能定義與要引入的文件名相同的函數,否則會報錯!
如果非要定義與引入文件相同名稱的函數,可以在調用自定義模塊函數的語句上一行引入自定義模塊。