首页 > 解决方案 > 无法从 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__ 方法,那就太好了!

谢谢(我在代码中很自律,所以任何检查/调试代码的建议都会很有趣,也许是另一个专门的问题......)。

标签: python

解决方案


所以我不完全确定发生了什么 - 检查模块的确切内容非常复杂。

但是我认为可能导致问题的一件事是您查询类的实例: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文件。


推荐阅读