Python的import嵌套


[root@fuel ~]# vi /var/lib/docker/devicemapper/mnt/4da57a0078c9d3f32e819373b67de41da37c34a27ee03f74016427e0223df5f2/rootfs/usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy/models/node.py
     88
     89 class Node(Base):

    304     @classmethod
    305     def delete_by_ids(cls, ids):
    306         db.query(Node).filter(Node.id.in_(ids)).delete('fetch')

     32 from nailgun.db import db
可看出引用了/usr/lib/python2.6/site-packages/nailgun/db.py中的db变量。


发现db.py不存在:
[root@fuel ~]# ls -l /var/lib/docker/devicemapper/mnt/4da57a0078c9d3f32e819373b67de41da37c34a27ee03f74016427e0223df5f2/rootfs/usr/lib/python2.6/site-packages/nailgun/db.py


进入nailgun目录:
[root@fuel ~]# cd /var/lib/docker/devicemapper/mnt/4da57a0078c9d3f32e819373b67de41da37c34a27ee03f74016427e0223df5f2/rootfs/usr/lib/python2.6/site-packages/nailgun
[root@fuel nailgun]# ls
发现nailgun目录下还有一个db目录:
[root@fuel nailgun]# cd db
[root@fuel db]# ls
deadlock_detector.py   deadlock_detector.pyo  __init__.pyc  migration
deadlock_detector.pyc  __init__.py            __init__.pyo  sqlalchemy
从网络了解到:“__init__.py”会在被导入时执行,因此这是Python另一种导入方式。


[root@fuel db]# vi __init__.py
     17 from nailgun.db.sqlalchemy import db
可看出引用了/usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy.py中的db变量。
同样不存在sqlalchemy.py,但存在sqlalchemy目录:


[root@fuel sqlalchemy]# vi __init__.py
     80 db = scoped_session(
     81     sessionmaker(
     82         autoflush=True,
     83         autocommit=False,
     84         bind=engine,
     85         query_cls=query_class,
     86         class_=session_class
     87     )
     88 )


     24 from sqlalchemy.orm import scoped_session
     26 from sqlalchemy.orm import sessionmaker

可看出引用了/usr/lib/python2.6/site-packages/sqlalchemy/orm.py中的scoped_session、sessionmaker变量。不存在orm.py,且不存在orm目录。


     19 from sqlalchemy import create_engine
     31 from nailgun.db.sqlalchemy import utils
     35 db_str = utils.make_dsn(**settings.DATABASE)
     36 engine = create_engine(db_str, client_encoding='utf8')
可看出引用了/usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy.py中的utils对象或/usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy/__init__.py中引用了utils对象。
db_str明显是数据库连接字符串,内容是“postgresql://nailgun:dvbbYDuU@168.5.21.2:5432/nailgun”。


     72 if settings.DEVELOPMENT:
     73     query_class = DeadlockDetectingQuery
     74     session_class = DeadlockDetectingSession
     75 else:
     76     query_class = NoCacheQuery
     77     session_class = Session

     32 from nailgun.settings import settings





进入docker:
[root@fuel sqlalchemy]# docker exec -it fuel-core-6.1-nailgun /bin/sh
sh-4.1# cd /usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy
sh-4.1# vi __init__.py
     33 #zzy added
     34 from nailgun.logger import logger
     35 import sys

     82 #zzy added
     83 logger.warning('____ffff____')
     84 logger.warning(sys.path)


sh-4.1# python __init__.py
sh-4.1# tail -n 20 /tmp/nailgun.log |grep WARNING
2016-01-27 06:24:20.257 WARNING [7f92c5287700] (__init__) ____ffff____
2016-01-27 06:24:20.257 WARNING [7f92c5287700] (__init__) ['/usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages']


orm.py或orm目录使用以下命令查找:
ls /usr/lib/python2.6/site-packages/nailgun/db/sqlalchemy/sqlalchemy/orm*
ls /usr/lib64/python26.zip/sqlalchemy/orm*
ls /usr/lib64/python2.6/sqlalchemy/orm*
ls /usr/lib64/python2.6/plat-linux2/sqlalchemy/orm*
ls /usr/lib64/python2.6/lib-tk/sqlalchemy/orm*
ls /usr/lib64/python2.6/lib-old/sqlalchemy/orm*
ls /usr/lib64/python2.6/lib-dynload/sqlalchemy/orm*
ls /usr/lib64/python2.6/site-packages/sqlalchemy/orm*
ls /usr/lib/python2.6/site-packages/sqlalchemy/orm*


最终发现:
sh-4.1# cd /usr/lib64/python2.6/site-packages/sqlalchemy/orm
sh-4.1# vi __init__.py
     63 from .scoping import (
     64     scoped_session
     65 )
     56 from .session import (
     57     Session,
     58     object_session,
     59     sessionmaker,
     60     make_transient,
     61     make_transient_to_detached
     62 )

从网络了解到,“.scoping”指“__init__.py”同一级目录的“scoping.py”:
sh-4.1# vi scoping.py
     14 __all__ = ['scoped_session']
     15
     16
     17 class scoped_session(object):
     18     """Provides scoped management of :class:`.Session` objects.
“__all__”定义只导出scoped_session类(当scoping.py被import的时候)。


sh-4.1# vi session.py
     27 __all__ = ['Session', 'SessionTransaction',
     28            'SessionExtension', 'sessionmaker']

   2253 class sessionmaker(_SessionClassMethods):
   2254
   2255     """A configurable :class:`.Session` factory.
   2256
   2257     The :class:`.sessionmaker` factory generates new
   2258     :class:`.Session` objects when called, creating them given
   2259     the configurational arguments established here.



/usr/lib64/python2.6/site-packages/sqlalchemy/orm/scoping.py
    105     def query_property(self, query_cls=None):
    106         """return a class property which produces a :class:`.Query` object
    107         against the class and the current :class:`.Session` when called.
    108
    109         e.g.::
    110
    111             Session = scoped_session(sessionmaker())
    112
    113             class MyClass(object):
    114                 query = Session.query_property()
    115
    116             # after mappers are defined
    117             result = MyClass.query.filter(MyClass.name=='foo').all()
    118
    119         Produces instances of the session's configured query class by
    120         default.  To override and use a custom implementation, provide
    121         a ``query_cls`` callable.  The callable will be invoked with
    122         the class's mapper as a positional argument and a session
    123         keyword argument.
    124
    125         There is no limit to the number of query properties placed on
    126         a class.
    127
    128         """
    129         class query(object):
    130             def __get__(s, instance, owner):
    131                 try:
    132                     mapper = class_mapper(owner)
    133                     if mapper:
    134                         if query_cls:
    135                             # custom query class
    136                             return query_cls(mapper, session=self.registry()        )
    137                         else:
    138                             # session's configured query class
    139                             return self.registry().query(mapper)
    140                 except orm_exc.UnmappedClassError:
    141                     return None
    142         return query()
    143


转载于:https://www.cnblogs.com/endoresu/p/5163317.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,处理嵌套的 JSON 数据也非常简单。如果 JSON 中的某个键的值也是一个 JSON 对象,那么在 Python 中,该键的值就会被解析为一个嵌套的字典对象。下面是一个例子: ```python import json # 定义一个 JSON 字符串 json_str = ''' { "name": "Alice", "age": 30, "address": { "street": "123 Main St", "city": "New York", "state": "NY" } } ''' # 将 JSON 字符串转换为 Python 字典对象 data = json.loads(json_str) # 访问嵌套的字典对象 print(data['name']) print(data['address']['city']) ``` 在这个例子中,我们定义了一个 JSON 字符串,其中包含了一个嵌套的 JSON 对象。然后使用 `json.loads` 函数将该 JSON 字符串转换为 Python 字典对象,并将其存储在变量 `data` 中。最后,我们可以像访问普通的字典对象一样,通过键名访问嵌套的字典对象。 输出结果应该类似于: ``` Alice New York ``` 如果需要将嵌套的字典对象转换为 JSON 字符串,可以像下面这样操作: ```python import json # 定义一个嵌套Python 字典对象 data = { 'name': 'Alice', 'age': 30, 'address': { 'street': '123 Main St', 'city': 'New York', 'state': 'NY' } } # 将字典对象转换为 JSON 字符串 json_str = json.dumps(data) # 打印 JSON 字符串 print(json_str) ``` 这个例子中,我们定义了一个嵌套Python 字典对象 `data`,其中包含了一个嵌套的字典对象。然后使用 `json.dumps` 函数将该字典对象转换为 JSON 字符串,并将其存储在变量 `json_str` 中。最后,我们可以使用 `print` 函数打印该 JSON 字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值