显然,PyV8无法正确将python列表转换为Javascript数组,这导致my_list.length返回undefined,该值将转换为None.

ctx = PyV8.JSContext()

ctx.enter()

ctx.locals.a = [{'a':1}]

print ctx.locals.a

#> [{'a': 1}]

print ctx.eval("a.length")

#> None

print ctx.eval("a[0].a")

#> 1

ctx.locals.blub = {'a':1}

print ctx.eval("blub.a")

#> 1

print ctx.eval("Object.keys(blub)")

#> a

ctx.locals.blub = {'a':[1,2,3]}

print ctx.eval("Object.keys(blub)")

#> a

print ctx.eval("blub.a")

#> [1, 2, 3]

ctx.locals.blub2 = [{'a':[1,2,3]}]

print ctx.eval("blub2")

#> [{'a': [1, 2, 3]}]

print ctx.eval("blub2.length")

#> None

print ctx.eval("Array.isArray(blub2)")

#> False

print ctx.eval("typeof(blub2)")

#> object

print ctx.eval("blub2[0].a")

#> [1, 2, 3]

print ctx.eval("typeof(blub.a)")

#> object

print ctx.eval("Array.isArray(blub.a)")

#> False

ctx.locals.blub3 = get_js_obj({'a':[1,2,3]})

ctx.locals.blub4 = get_js_obj([1,2,3])

ctx.eval("blub3.a.length")

#> 3

ctx.eval("blub4.length")

#> 3

这里是功能.

def access_with_js(ctx, route):

if len(route) == 0:

raise Exception("route must have at least one element")

accessor_string = route[0]

for elem in route[1:]:

if type(elem) in [str, unicode]:

accessor_string += "['" + elem + "']"

elif type(elem) == int:

accessor_string += "[" + str(elem) + "]"

else:

raise Exception("invalid element in route, must be text or number")

return ctx.eval(accessor_string)

def get_py_obj(ctx, obj, route=[]):

def dict_is_empty(dict):

for key in dict:

return False

return True

def access(obj, key):

if key in obj:

return obj[key]

return None

cloned = None

if isinstance(obj, list) or isinstance(obj, PyV8.JSArray):

cloned = []

temp = str(access_with_js(ctx, route)) #working around a problem with PyV8 r429

num_elements = len(obj)

for index in range(num_elements):

elem = obj[index]

cloned.append(get_py_obj(ctx, elem, route + [index]))

elif isinstance(obj, dict) or isinstance(obj, PyV8.JSObject):

cloned = {}

for key in obj.keys():

cloned_val = None

if type(key) == int:

#workaround for a problem with PyV8 where it won't let me access

#objects with integer accessors

val = None

try:

val = access(obj, str(key))

except KeyError:

pass

if val == None:

val = access(obj, key)

cloned_val = get_py_obj(ctx, val, route + [key])

else:

cloned_val = get_py_obj(ctx, access(obj, key), route + [key])

cloned[key] = cloned_val

elif type(obj) == str:

cloned = obj.decode('utf-8')

else:

cloned = obj

return cloned

def get_js_obj(ctx,obj):

#workaround for a problem with PyV8 where it will implicitely convert python lists to js objects

#-> we need to explicitely do the conversion. see also the wrapper classes for JSContext above.

if isinstance(obj, list):

js_list = []

for entry in obj:

js_list.append(get_js_obj(ctx,entry))

return PyV8.JSArray(js_list)

elif isinstance(obj, dict):

js_obj = ctx.eval("new Object();") # PyV8.JSObject cannot be instantiated from Python

for key in obj.keys():

try:

js_obj[key] = get_js_obj(ctx,obj[key])

except Exception, e:

# unicode keys raise a Boost.Python.ArgumentError

# which can't be caught directly:

# https://mail.python.org/pipermail/cplusplus-sig/2010-April/015470.html

if (not str(e).startswith("Python argument types in")):

raise

import unicodedata

js_obj[unicodedata.normalize('NFKD', key).encode('ascii','ignore')] = get_js_obj(ctx,obj[key])

return js_obj

else:

return obj

python转js对象_将Python对象转换为PyV8的JavaScript相关推荐

  1. python list存储对象_《python解释器源码剖析》第4章--python中的list对象

    4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...

  2. 传入json对象_【Python基础】可迭代对象amp;迭代器对象及其实现

    可迭代对象 首选确保for循环的in后面是一个可迭代对象,这样就能通过python内置函数iter()得到一个迭代器对象(iterator) 我们分别把列表list_test和字符串str_test分 ...

  3. python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...

    判断Python对象是不是为文件对象的方法有哪些 发布时间:2020-08-13 14:01:00 来源:亿速云 阅读:76 作者:小新 这篇文章主要介绍判断Python对象是不是为文件对象的方法有哪 ...

  4. python 清空所有对象_学习python第38天

    今天分享一下python的内存管理和隔代回收 对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象 ...

  5. python可变对象 不可变对象_【Python】可变对象和不可变对象

    在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使 ...

  6. python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...

  7. python调用js接口_最全总结!聊聊 Python 调用 JS 的几种方式

    原标题:最全总结!聊聊 Python 调用 JS 的几种方式 作者 | 星安果 来源 | AirPython 1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页 ...

  8. python中级项目下载_中级Python复习:教程,项目思想和技巧

    python中级项目下载 本文旨在向Python初学者和开发人员介绍Python中使用的一些关键概念,这些概念一开始就没有讲授. 如果您可以创建二次方根求解器,则可以理解本文. 这些是我一天之内没有学 ...

  9. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

  10. python语言面试基础_【python面试指北】1.语言基础

    1. python是动态强类型的语言. 动态还是静态指的是编译器还是运行期确定类型 强类型指的是不会发生隐式类型转换.比如js能够执行1+"1",但是python不行,所以pyth ...

最新文章

  1. php ob_flush无效,php ob_flush,flush在ie中缓冲无效的解决方法
  2. Python性能分析指南——中
  3. 自己写分布式配置中心(上篇)- 单机模式
  4. 鼓作气学会“一致性哈希”,就靠这 18 张图了
  5. CentOS7安装ipython
  6. 升级到Windows 8.1
  7. 排序算法时间复杂度、空间复杂度、稳定性比较
  8. Android数据储存之SharedPreferences总结
  9. 【Oracle AWR详解分析-02】
  10. 三个网络接口计算机主板,电脑主板接口安装详解
  11. 微信小程序《难忘便签》开发记录
  12. python数据处理——如何将xlsx、xls文件转换为tsv文件
  13. preg_match详解
  14. jquery点击图片放大效果
  15. 装逼必备:大型分布式网站术语分析
  16. 秒懂所有USB接口类型,USB接口大全
  17. 剩余空间,自由再生——城市高架桥下空间的活化再生研究
  18. 在Power BI中用DAX计算净现值NPV
  19. 封神台-尤里的复仇Ⅰ
  20. 数据结构-顺序表的顺序存储

热门文章

  1. Windows:文件系统FAT32、NTFS和exFAT
  2. 领域驱动设计(Domain Driven Design,DDD)
  3. Fedora 14 直接root登录
  4. 安川机器人仿真软件MOTOSIM EG
  5. java火柴人吃豆豆,4399游戏火柴人吃豆豆全图文通关攻略分享
  6. 鸿蒙升级之前APP没有,升级鸿蒙2.0之后,没有原生的日历app了
  7. #入坑keychron# 简单说说K3的使用体验
  8. javascript获取屏幕高度和宽度、监听屏幕大小改变
  9. matlab freqz half,[转载]Matlab freqz函数使用
  10. wifi 性能 测试 android,WiFi性能测试