python - 无法从 Python 中的对象检查代码
问题描述
这是我的代码的开头:
import os
from flask import Flask, render_template, session, redirect, url_for, flash
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
bootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
a=db.Model
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role')
def __repr__(self):
return '<Role %r>' % self.name
由于我在 Role 中没有看到init方法,我想它在父类 db.Model 中。所以我想看看这个类是如何定义的。我在上面的脚本和 python 终端运行中创建了名为“a”的对象:
In [11]: inspect.getmodule(a)
Out[11]: <module 'sqlalchemy.ext.declarative.api' from 'c:\\users\\laurent\\google drive\\python\\venv\\lib\\site-packages\\sqlalchemy\\ext\\declarative\\api.py'>
In [12]: inspect.getsource(a)
...
C:\Python35\lib\inspect.py in findsource(object)
785 return lines, candidates[0][1]
786 else:
--> 787 raise OSError('could not find class definition')
788
789 if ismethod(object):
OSError: could not find class definition
为什么我会收到此错误?该类似乎来自 python 脚本(不是 C 代码)。此外,如果有人可以为我提供父类的 __init__ 方法,那就太好了!
谢谢(我在代码中很自律,所以任何检查/调试代码的建议都会很有趣,也许是另一个专门的问题......)。
解决方案
所以我不完全确定发生了什么 - 检查模块的确切内容非常复杂。
但是我认为可能导致问题的一件事是您查询类的实例:a
而不是实际的类。
如果您确实查询您得到的课程:
>>> t = type(a)
>>> t
flask_sqlalchemy.model.DefaultMeta
>>> inspect.getsourcefile(t)
'...\\site-packages\\flask_sqlalchemy\\model.py'
>>> inspect.getsource(t)
'class DefaultMeta(NameMetaMixin, BindMetaMixin, DeclarativeMeta):\n pass\n'
因此,检查类返回适当的源文件似乎是有道理的。我不明白的是为什么检查类的实例会返回 `'...\site-packages\sqlalchemy\ext\declarative\api.py'。
如果它不返回包含类定义的文件,我希望它返回实例化的文件,但这将是您运行的脚本而不是该api.py
文件。
推荐阅读
- pandas - 删除非英文数据
- javascript - 如何在静态页面和生成的页面之间共享查询?
- c++ - 在控制台中“垂直”输出向量的向量内容
- php - 通过模型关系删除laravel中的图像
- php - 对象数组的数组交集
- dll - 在一台 PC 上无法使用 PyInstaller 找到 DLL,但可以在另一台 PC 上找到
- python - 如何根据另一个数据框中的组在熊猫数据框中创建指标列?
- reactjs - 两个不同父母的孩子可以在 React 中拥有相同的键吗
- excel - UserForm ComboBox 从动态工作表列表填充,从第一个 ComboBox 的选择中添加第二个 ComboBox
- javascript - React Redux:我的 React 组件没有收到更新的数组作为道具