想了解将Python列表传递给嵌入式Rust函数的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于python函数传入一个列表的相关问题,此外,我们还将为您介绍关于jquery–将json列表
想了解将Python列表传递给嵌入式Rust函数的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于python函数传入一个列表的相关问题,此外,我们还将为您介绍关于jquery – 将json列表传递给MVC 3、Python + C/C++ 嵌入式编程:Qt向Python传递数组、python列表查询、list函数、元组、templates – 将Twig块传递给嵌入式模板的新知识。
本文目录一览:- 将Python列表传递给嵌入式Rust函数(python函数传入一个列表)
- jquery – 将json列表传递给MVC 3
- Python + C/C++ 嵌入式编程:Qt向Python传递数组
- python列表查询、list函数、元组
- templates – 将Twig块传递给嵌入式模板
将Python列表传递给嵌入式Rust函数(python函数传入一个列表)
我正在学习如何在Python中嵌入Rust函数,并且如果我的输入是int
s而不是list ,一切都可以正常工作。
如果我的lib.rs
文件是:
#[no_mangle]pub extern fn my_func(x: i32, y: i32) -> i32 { return x + y;}
我可以这样使用:
In [1]: from ctypes import cdllIn [2]: lib = cdll.LoadLibrary("/home/user/RustStuff/embed/target/release/libembed.so")In [3]: lib.my_func(5,6)Out[3]: 11
但是,如果我更改lib.rs
为:
#[no_mangle]pub extern fn my_func(my_vec: Vec<i32>) -> i32 { let mut my_sum = 0; for i in my_vec { my_sum += i; } return my_sum;}
我不能再在Python中使用它(此编译良好):
In [1]: from ctypes import cdllIn [2]: lib = cdll.LoadLibrary("/home/user/RustStuff/embed/target/release/libembed.so")In [3]: lib.my_func([2,3,4])---------------------------------------------------------------------------ArgumentError Traceback (most recent call last)<ipython-input-3-454ffc5ba9dd> in <module>()----> 1 lib.my_func([2,3,4])ArgumentError: argument 1: <type ''exceptions.TypeError''>: Don''t know how to convert parameter 1
原因,尽管我可以这样做是因为Pythonlist
和RustVec
都是 动态数组 ,但显然我在这里缺少了一些东西。
为什么我的尝试不起作用?我该怎么做才能解决?
答案1
小编典典不要这样做:
#[no_mangle]pub extern fn my_func(my_vec: Vec<i32>) -> i32 { ... }
基本上,您 从不 希望接受或返回extern
函数中的任意Rust对象,仅是Repr
。相反,您应该接受C可以表示的内容。正如6502所说的,对于这种特殊情况,最好的主意是接受一个指针和一个长度。
Vec
从概念上讲,Rust的指针指向数据,计数 和容量
。您可以Vec
通过添加或删除对象来修改,这可能导致重新分配。这是双重不利的,因为Python和Rust可能使用彼此不兼容的不同分配器。分段错误就是这样!你真的想要
切片 。
相反,在Rust方面执行以下操作:
extern crate libc;use libc::{size_t,int32_t};use std::slice;#[no_mangle]pub extern fn my_func(data: *const int32_t, length: size_t) -> int32_t { let nums = unsafe { slice::from_raw_parts(data, length as usize) }; nums.iter().fold(0, |acc, i| acc + i)}
也就是说,您正在使用保证匹配的C类型,然后将指针和长度转换为Rust知道如何处理的东西。
我不是Pythonista,但是这个经过拼凑的代码(在“如何使用ctypes将Python列表转换为C数组?”的帮助下)似乎可以与上面的Rust一起使用:
import ctypeslib = ctypes.cdll.LoadLibrary("./target/debug/libpython.dylib")lib.my_func.argtypes = (ctypes.POINTER(ctypes.c_int32), ctypes.c_size_t)list_to_sum = [1,2,3,4]c_array = (ctypes.c_int32 * len(list_to_sum))(*list_to_sum)print lib.my_func(c_array, len(list_to_sum))
当然,您可能希望将其包装起来以使其对您的代码调用者更好。
jquery – 将json列表传递给MVC 3
var params = { 'productId': productId,'list': [] }; $.each($('.specificationId'),function () { var specId = $(this).attr('id').replace('specification_',''); var specification = { specificationId: specId,articleId: $('#articleid_' + specId).attr('value'),price: $('#price_' + specId).attr('value'),stock: $('#stock_' + specId).attr('value'),stockCount: $('#stockcount_' + specId).attr('value'),weight: $('#weight_' + specId).attr('value'),visible: $('#visible_' + specId).attr('checked') }; params.list.add(specification); }); console.log(params); //all values are parsed fine here,shows an array with json objects $.ajax({ type: "POST",url: "/Admin/Product/Save/",data: params,success: function () { alert('done'); } });
现在这必须像这样去控制器:
[HttpPost] public Boolean Save(Int32 productId,Object[] specifications) { return true; }
但是Object []不起作用,返回null,我尝试了各种各样的东西,比如模型列表等,但是它会保持为null.
如何解决这个问题?
@H_301_2@解决方法
因此,创建与您尝试提交的JSON匹配的简单POCO:
public class ProductJsonModel { public int ProductId { get; set; } public ProductSpecificationjsonModel[] @List { get; set; } } public class ProductSpecificationjsonModel { public int SpecificationId { get; set; } public int ArticleId { get; set; } public double Price { get; set; } public int Stock { get; set; } public int StockCount { get; set; } public int Weight { get; set; } public bool Visible { get; set; } }
然后在你的行动中接受:
[HttpPost] public Boolean Save(ProductJsonModel model)
只要JSON对象中的属性名称与POCO中的属性名称匹配,MVC就会为您绑定.
此外 – 您应该使用.stringify或类似的东西序列化JSON,并相应地设置$.ajax对象的contentType.
@H_301_2@ @H_301_2@总结
以上是小编为你收集整理的jquery – 将json列表传递给MVC 3全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
jQuery相关文章
- • Jquery属性选择器(同时匹配多个条件,与
- • jquery的$().each,$.each 遍历对象和数
- • [JQ权威指南]动画表格排序插件TableSor
- • [JQ权威指南]使用JQuery调用XML实现无刷
- • [JQ权威指南]类级别插件开发
- • [JQ权威指南]validate验证插件
- • [JQ权威指南]SlideDown()与SlideUp()方
- • [JQ权威指南]animate() 方法
- • [JQ权威指南]对象级别插件的开发
- • [JQ权威指南]JQuery操作XML数据
Python + C/C++ 嵌入式编程:Qt向Python传递数组
编程环境Qt5.7.1 MSVC版,VS2013,python3.7.1,我使用Qt像python传递字节数组,Qt和python代码如下,当多次点击按钮多次调用(第二次调用时)python程序时,提示程序异常结束。
Qt程序:
INCLUDEPATH +=D:/Python3.7.3/include
INCLUDEPATH += D:/Python3.7.3/Lib/site-packages/numpy/core/include
LIBS += -LD:/Python3.7.3/libs/ -lpython37
int init_numpy()
{
import_array();
}
void MainWindow::on_ButtonNumpy_clicked()
{
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
init_numpy();
if (!Py_IsInitialized())
{
printf("初始化失败!");
return ;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(''./'')");//这一步很重要,修改Python路径
PyObject pModule = PyImport_ImportModule("demo2");//这里是要调用的文件名hello.py
PyObject pDict = PyModule_GetDict(pModule);
if (pModule == NULL)
{
printf("Can''t open python file\n");
return ;
}
//PyObject pFunc = PyObject_GetAttrString(pModule, "szSecTest");
double CArrays[3][3] = {{1.3, 2.4, 5.6}, {4.5, 7.8, 8.9}, {1.7, 0.4, 0.8}};
qDebug()<<"rrr";
npy_intp Dims[2] = {3, 3};
//生成包含这个多维数组的PyObject对象,使用PyArray_SimpleNewFromData函数,第一个参数2表示维度,第二个为维度数组Dims,第三个参数指出数组的类型,第四个参数为数组
PyObject PyArray = PyArray_SimpleNewFromData(2, Dims, NPY_DOUBLE, CArrays);
PyObject ArgArray = PyTuple_New(1);
PyTuple_SetItem(ArgArray, 0, PyArray);
PyObject pFunc = PyDict_GetItemString(pDict , "Test");//这里是要调用的函数名
// PyObject * pFunc = PyObject_GetAttrString(pModule , "Test");
if (!pFunc){
printf("Get function hello failed\n");
return ;
} PyObject *pRrturn = PyObject_CallObject(pFunc, ArgArray); qDebug()<<pRrturn; PyArray = NULL; ArgArray = NULL; pRrturn = NULL; pModule=NULL; pDict=NULL; Py_Finalize();
}
python程序:import numpy as np
def Test(test):
print (test.shape,test[0], test[1],test[2])
报错:
Starting F:\Qt\build-TestNumpy-Desktop_Qt_5_7_1_MSVC2013_32bit-Release\release\TestNumpy.exe...
rrr
(3, 3) [1.3 2.4 5.6] [4.5 7.8 8.9] [1.7 0.4 0.8]
0x66937c44
D:\搜狗输入法\SogouInput\Components\程序异常结束。
F:\Qt\build-TestNumpy-Desktop_Qt_5_7_1_MSVC2013_32bit-Release\release\TestNumpy.exe crashed.
python列表查询、list函数、元组
查:list.index()返回查找到的坐标
-
print(list1.index(5)); in和not in可以查找某个元素是否存在列表内,返回布尔类型 print(1 in list1); print(1 not in list1);
- 嵌套列表
-
list3=[[''张飞'',''刘备'',''关羽''],[''zhangfei'',''liubei'',''guanyu'']]; print(list3[0]);#读取嵌套列表内的数据,用过下标提取 print(list3[1]); print(list3[1][1]);
list函数
-
#len(list) 列表元素的个数 print(len(list3));#读取列表长度 for i in range(len(list2)):#遍历列表长度,返回下标 print(i); for i in range(len(list2)): # 遍历列表长度,返回列表内的数据 print(list2[i]);
- 列表中最大值,最小值list1.max(),list1.min()
-
print(max(list2)); print(min(list2)); print(max([''a'',''B'',''c'']))#返回c print(max([''aac'',''aab'',''abc'',''aca'']))#第一位比较完,比较第二位大小
- list(seq)将元组转换成列表
-
print((''1'',''3'',''33'',''ffe'')) print(list((''1'',''3'',''33'',''ffe'')))
- everse()反向列表中的元素
-
list1=[''a'',''b'',''c'',''d'',''e''] list1.reverse()#返回列表的倒叙 print(list1)
- sort([func])排序,默认升序
-
list2=[5,3,6,2,8] list2.sort()#返回从小到大排序 print(list2)
- clear()请空列表
-
list3=[''1'',''2'',''3'',''4''] list3.clear()#返回空列表 print(list3)
- copy()复制列表,在内存中又开辟了一个空间;通过等号复制副本,在内存中指向原来的地址
-
list1=[''a'',''b'',''c'',''d'',''e'']; list2=[5,3,6,2,8]; list2=list1.copy(); print(list2)
- eval()将元组、字典、列表类型的字符串转为元组、字典、列表,可以把list,tuple,dict和string相互转化
-
a="[[1,2], [3,4], [5,6]]";#字符串转换成列表 m=eval(a); print(type(m)); print(m);
-
a="{''a'':''A'',''b'':''B''}";#字符串转换成字典 m=eval(a); print(type(m)); print(m);
-
a="(''a'',''b'',''c'')";#字符串转换成元组 m=eval(a) print(type(m)); print(m);
小练习
- 定义一个列表,让用户动态输入5个值,遍历输出列表的值
-
nums=[] for i in range(5): nums.append(input(''请输入:'')) else: print(''输入完毕!'') print(nums);
元组
- 元组与列表类似,但是元组的元素不能修改
-
c=(2,3,3,''tom'',''OK'',False) d=(''张飞'',''刘备'') c=c+d; print( c[:].index(''张飞''))#访问,使用切片 print(c[:4]) print(c[::-1])
a=(1,2); b=(3,4); c=a+b#运算符 + * in not in print(c); d=a*2 print(d)
-
通讯录管理系统
-
print("=======通讯录管理系统=======") print("1.增加姓名和手机") print("2.删除姓名") print("3.修改手机") print("4.查询所有用户") print("5.根据姓名查找手机号") print("6.退出") print("============================") name_list=[] phone_list=[] while True: input_val=int(input(''请输入操作项:'')) if input_val in range(1,7): if input_val==1: name_list.append(input(''请输入姓名:'')) phone_list.append(input(''请输入电话:'')) print(''姓名和电话:'',name_list,phone_list) sign=input(''是否继续:y/n'') if sign==''n'': break else: continue elif input_val==2: print(name_list) sign=input(''是否删除姓名:y/n'') if sign==''y'': del name_list[:] print(''已删除!'') sign=input("是否退出y/n") if sign==''y'': break else: continue else: print(''未进行删除!'') elif input_val==3: phone=(input(''请输入需要修改的手机:'')) if phone not in phone_list: print(''请重新输入电话!'') else: phone_list[(phone_list).index(phone)]=(input(''请输入修改后的手机:'')) print(''已成功修改手机!'') sign = input("是否退出y / n") if sign == ''y'': break else: continue elif input_val==4: print(''所有用户:'',name_list[:]) elif input_val==5: names_reac=input(''请输入姓名:'') if names_reac in name_list[:]: print(names_reac,''的手机为'',phone_list[name_list.index(names_reac)]) sign=input(''是否继续y/n'') if sign==''n'': break else: continue else: print(''未查询到该人!'') else: break else: print("输入有误!") print("谢谢使用!")
templates – 将Twig块传递给嵌入式模板
page.phtml
<div> {% block block1 %}default content{% endblock %} <ul> ... </ul> {% block block2 %}{% endblock %} </div>
我有一个event.phtml模板,它嵌入了page.phtml并在页面中添加了一些其他内容;它还会覆盖默认页面的block1内容
event.phtml
<html> <body> <h1>Event Page</h1> {% embed "page.phtml" %} {% block block1 %}event page content{% endblock %} {% endembed %} </body> </html>
我有一个自定义事件页面,只需要修改一些事件页面的块,所以我像这样扩展了event.phtml
custom_event.phtml
{% extends "event.phtml" %} {% block block2 %}overridden value{% endblock %}
并期望block2的重写内容显示在父模板嵌入的page.phtml模板中.我可以在父模板中输出block2的值,它就在那里,但在嵌入式模板中却没有.我尝试在嵌入的event.phtml中显式传递块,就像这样
{%embed "page.phtml" %} {% block block2 %}{{parent()}}{% endblock %} ... {% endembed %}
但这并没有产生任何影响.如何从custom_event.phtml模板中一直通过扩展的event.phtml模板和嵌入的page.phtml模板获取重写的block2?
解决方法
{%embed%}在技术上定义了一个新的(匿名)模板,它扩展了嵌入式模板(这就是它可以覆盖块的方式)并被包含在当前的模板中.这实际上只是{%include%}和{%extends%}的语法糖,以避免必须将此部分模板存储在自己的文件中并仅包含一次.子模板不能扩展Twig包含.只有当前模板的块可用于扩展.并且event.phtml没有任何块.
关于将Python列表传递给嵌入式Rust函数和python函数传入一个列表的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于jquery – 将json列表传递给MVC 3、Python + C/C++ 嵌入式编程:Qt向Python传递数组、python列表查询、list函数、元组、templates – 将Twig块传递给嵌入式模板等相关内容,可以在本站寻找。
本文标签: