python转js对象_将Python对象转换为PyV8的JavaScript
显然,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相关推荐
- python list存储对象_《python解释器源码剖析》第4章--python中的list对象
4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...
- 传入json对象_【Python基础】可迭代对象amp;迭代器对象及其实现
可迭代对象 首选确保for循环的in后面是一个可迭代对象,这样就能通过python内置函数iter()得到一个迭代器对象(iterator) 我们分别把列表list_test和字符串str_test分 ...
- python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...
判断Python对象是不是为文件对象的方法有哪些 发布时间:2020-08-13 14:01:00 来源:亿速云 阅读:76 作者:小新 这篇文章主要介绍判断Python对象是不是为文件对象的方法有哪 ...
- python 清空所有对象_学习python第38天
今天分享一下python的内存管理和隔代回收 对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象 ...
- python可变对象 不可变对象_【Python】可变对象和不可变对象
在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使 ...
- python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象
Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...
- python调用js接口_最全总结!聊聊 Python 调用 JS 的几种方式
原标题:最全总结!聊聊 Python 调用 JS 的几种方式 作者 | 星安果 来源 | AirPython 1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页 ...
- python中级项目下载_中级Python复习:教程,项目思想和技巧
python中级项目下载 本文旨在向Python初学者和开发人员介绍Python中使用的一些关键概念,这些概念一开始就没有讲授. 如果您可以创建二次方根求解器,则可以理解本文. 这些是我一天之内没有学 ...
- python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议
<Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: <Python之禅>中对于Pyt ...
- python语言面试基础_【python面试指北】1.语言基础
1. python是动态强类型的语言. 动态还是静态指的是编译器还是运行期确定类型 强类型指的是不会发生隐式类型转换.比如js能够执行1+"1",但是python不行,所以pyth ...
最新文章
- php ob_flush无效,php ob_flush,flush在ie中缓冲无效的解决方法
- Python性能分析指南——中
- 自己写分布式配置中心(上篇)- 单机模式
- 鼓作气学会“一致性哈希”,就靠这 18 张图了
- CentOS7安装ipython
- 升级到Windows 8.1
- 排序算法时间复杂度、空间复杂度、稳定性比较
- Android数据储存之SharedPreferences总结
- 【Oracle AWR详解分析-02】
- 三个网络接口计算机主板,电脑主板接口安装详解
- 微信小程序《难忘便签》开发记录
- python数据处理——如何将xlsx、xls文件转换为tsv文件
- preg_match详解
- jquery点击图片放大效果
- 装逼必备:大型分布式网站术语分析
- 秒懂所有USB接口类型,USB接口大全
- 剩余空间,自由再生——城市高架桥下空间的活化再生研究
- 在Power BI中用DAX计算净现值NPV
- 封神台-尤里的复仇Ⅰ
- 数据结构-顺序表的顺序存储
热门文章
- Windows:文件系统FAT32、NTFS和exFAT
- 领域驱动设计(Domain Driven Design,DDD)
- Fedora 14 直接root登录
- 安川机器人仿真软件MOTOSIM EG
- java火柴人吃豆豆,4399游戏火柴人吃豆豆全图文通关攻略分享
- 鸿蒙升级之前APP没有,升级鸿蒙2.0之后,没有原生的日历app了
- #入坑keychron# 简单说说K3的使用体验
- javascript获取屏幕高度和宽度、监听屏幕大小改变
- matlab freqz half,[转载]Matlab freqz函数使用
- wifi 性能 测试 android,WiFi性能测试