摘要:上周又推出了新一輪服務(wù)器端增強(qiáng)函數(shù)庫。對(duì),你沒看錯(cuò),在服務(wù)器端其實(shí)可以輕松從其他語種的函數(shù)庫中直接拿來調(diào)用,不需要修改任何內(nèi)容。執(zhí)行函數(shù)方法用于帶參數(shù)執(zhí)行某個(gè)函數(shù)。
上周Perfect又推出了新一輪服務(wù)器端Swift增強(qiáng)函數(shù)庫:Perfect-Python。對(duì),你沒看錯(cuò),在服務(wù)器端Swift 其實(shí)可以輕松從其他語種的函數(shù)庫中直接拿來調(diào)用,不需要修改任何內(nèi)容。如果沒有類似經(jīng)驗(yàn)的童鞋可以參考拙作:
(1)CSwift:https://github.com/RockfordWe... ,
——如何在Swift程序中直接嵌入C語言源代碼
(2)csweet:https://github.com/RockfordWe...,
——如何在Swift程序中直接嵌入C++語言源代碼
(周末剛做的,文檔還沒來得及寫呢,湊合看源代碼吧哈)
而Perfect-Python不是簡單嵌入源代碼的問題,是允許用戶直接調(diào)用Python函數(shù)庫本身?。。?!
為什么花大力氣做這些東西?很簡單,程序員都是很懶的家伙,與其重新把幾萬行代碼重寫一遍,不如直接抓壯丁來的快——現(xiàn)成成熟的代碼在快速原型法中起的作用之大難以想象。
不錯(cuò),是由一些很矯情的家伙宣稱什么“語言的純潔性”,比如Vapor,去年一直號(hào)稱要“純潔的Swift”,結(jié)果兩周前終于頂不住壓力,參考上一期Ryan的報(bào)告可以看到:
Vapor is no longer pure Swift as of Vapor 2, and includes at least chttp and LibreSSL / OpenSSL.
翻譯“Vapor已經(jīng)不像Vapor 2那樣使用純Swift語言了,因?yàn)橹辽侔艘? 個(gè)C語言組件chttp和LibreSSL / OpenSSL加密函數(shù)庫”
看見了嗎?Vapor作為典型的反面教材,在陷入服務(wù)器性能問題的泥潭后終于招架不住投降了——用了兩年時(shí)間證明一個(gè)光鮮的口號(hào)是錯(cuò)誤的,這是什么樣的代價(jià)!“實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)”——閉門思過去吧。
實(shí)踐證明,全棧開發(fā)需要揚(yáng)長避短,然后用統(tǒng)一的一種編譯型語言做主調(diào)是在性能和效率上達(dá)到最合理平衡點(diǎn)的,目的是:
快速開發(fā)項(xiàng)目
維持代碼穩(wěn)定性
項(xiàng)目人工最小化
最短學(xué)習(xí)曲線
保持組件最新
高性能服務(wù)器
迅速增加更多新功能——這是最關(guān)鍵最關(guān)鍵的
好了,言歸正傳,我們看一下Perfect-Python的具體用法:
本項(xiàng)目提供了在Swift服務(wù)器應(yīng)用上直接引用Python 2.7函數(shù)庫的簡便方法。
本項(xiàng)目采用Swift Package Manager 軟件包管理器編譯,是Perfect 項(xiàng)目的一部分,但是也可以獨(dú)立運(yùn)行
在使用之前請(qǐng)準(zhǔn)備好最新的Swift 3.1 / 4.0 工具鏈
Linux 編譯事項(xiàng)首先請(qǐng)確保 libpython2.7-dev 已經(jīng)在 Ubuntu 16.04 上正確安裝:
$ sudo apt-get install libpython2.7-devMacOS 編譯事項(xiàng)
請(qǐng)確定 Xcode 8.3.3 / 9.0 以上版本已經(jīng)正確安裝
快速上手首先在Package.swift中增加依存關(guān)系:
.Package(url: "https://github.com/PerfectlySoft/Perfect-Python.git", majorVersion: 1)
然后將下列頭文件導(dǎo)入Swift源代碼:
import PythonAPI import PerfectPython
請(qǐng)注意在任何程序調(diào)用之前,必須調(diào)用Py_Initialize()函數(shù)初始化python嵌入環(huán)境:
Py_Initialize()導(dǎo)入Python函數(shù)庫模塊
使用 PyObj 類對(duì)象用于導(dǎo)入python模塊。下列參考范例中,一個(gè)名為/tmp/clstest.py的腳本被動(dòng)態(tài)導(dǎo)入到當(dāng)前Swift運(yùn)行環(huán)境:
let pymod = try PyObj(path: "/tmp", import: "clstest")訪問Python變量
導(dǎo)入模塊后,您可以使用PyObj.load()函數(shù)加載任何一個(gè)變量;也可以反過來用 PyObj.save()命令保存當(dāng)前變量為一個(gè)新的值。
比如,以下python腳本中有個(gè)叫做 stringVar 的字符串變量:
stringVar = "Hello, world"
那么要取得這個(gè)字符串的值只需要這樣做:
if let str = pymod.load("stringVar")?.value as? String { print(str) // 會(huì)打印變量的字符串值 "Hello, world!" }
此時(shí)您還可以為該變量直接寫入新的字符串值:
try pymod.save("stringVar", newValue: "Hola!")
注意 目前,Perfect-Python僅支持如下Swift / Python數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換:
Python 類型 | Swift 類型 | 備注 |
---|---|---|
int | Int | |
float | Double | |
str | String | |
list | [Any] | 遞歸轉(zhuǎn)換 |
dict | [String:Any] | 遞歸轉(zhuǎn)換 |
比如,您可以把一個(gè)字符串 String 轉(zhuǎn)換為 PyObj,通過 let pystr = "Hello".python() 或者 let pystr = try PyObj(value:"Hello") 完成轉(zhuǎn)換。
反過來,如果要把 PyObj 類轉(zhuǎn)換為Swift數(shù)據(jù)類型,比如字符串,則仍然有兩種方法:let str = pystr.value as? String 和 let str = String(python: pystr)。
執(zhí)行Python函數(shù)方法 PyObj.call() 用于帶參數(shù)執(zhí)行某個(gè)python函數(shù)。以如下python腳本為例:
def mymul(num1, num2): return num1 * num2
Perfect-Python 可以用下列方法封裝并調(diào)用以上函數(shù),您所需要注意的僅僅是其函數(shù)名稱以及參數(shù)。其中函數(shù)名稱用字符串代替,而參數(shù)用一個(gè)數(shù)組表達(dá):
if let res = pymod.call("mymul", args: [2,3])?.value as? Int { print(res) // 結(jié)果為 6 }Python類對(duì)象
請(qǐng)同樣使用 PyObj.load() 函數(shù)用于家在Python類對(duì)象,但是注意后面一定要緊跟一個(gè)PyObj.construct() 用于初始化類對(duì)象實(shí)例。該方法同樣支持用一個(gè)任意類型的數(shù)組作為參數(shù)進(jìn)行對(duì)象構(gòu)造。
假設(shè)如下腳本的典型python類對(duì)象 Person,該類有兩個(gè)屬性姓名name 和年齡age,還有一個(gè)名為“自我介紹”的類對(duì)象方法intro():
class Person: def __init__(self, name, age): self.name = name self.age = age def intro(self): return "Name: " + self.name + ", Age: " + str(self.age)
在Swift中初始化上述類對(duì)象的方法需要進(jìn)行以下兩步走:
if let personClass = pymod.load("Person"), let person = personClass.construct(["rocky", 24]) { // person is now the object instance }
之后就可以訪問類實(shí)例的屬性變量和方法了,如同上文所提到的普通變量和函數(shù)調(diào)用的方法一樣:
if let name = person.load("name")?.value as? String, let age = person.load("age")?.value as? Int, let intro = person.call("intro", args: [])?.value as? String { print(name, age, intro) }回調(diào)函數(shù)
參考以下python代碼,此時(shí)如果執(zhí)行 x = caller("Hello", callback) 則可以將函數(shù)作為參數(shù)進(jìn)行回調(diào):
def callback(msg): return "callback: " + msg def caller(info, func): return func(info)
在Swift中等效的代碼平淡無奇,只不過將待調(diào)函數(shù)作為參數(shù)而已::
if let fun = pymod.load("callback"), let result = pymod.call("caller", args: ["Hello", fun]), let v = result.value as? String { print(v) // 結(jié)果是 "callback: Hello" }更多信息
關(guān)于本項(xiàng)目更多內(nèi)容,請(qǐng)參考perfect.org.
掃一掃 Perfect 官網(wǎng)微信號(hào)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40801.html
摘要:的官方網(wǎng)址為,其使用手冊(cè)網(wǎng)址為本次分享將實(shí)現(xiàn)的功能為利用爬取某個(gè)搜索詞語暫僅限英文的百度百科的介紹部分,具體的功能介紹可以參考博客爬蟲自制簡單的搜索引擎。 ??Jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。Jsoup的官方網(wǎng)址為: https:...
摘要:寫在前面最近每日一更,我這菜雞都有點(diǎn)兒不好意思了簡單介紹簡單用法是讓我們用程序來測試這個(gè),如果相當(dāng)于,那么一個(gè)出來。 寫在前面 最近每日一更,我這菜雞都有點(diǎn)兒不好意思了 簡單介紹 簡單用法是: assert expression 讓我們用程序來測試這個(gè)expression,如果expression相當(dāng)于False,那么raise一個(gè)AssertionError出來。即邏輯上等同于: i...
摘要:說到,大家可能覺得很簡單呀,不就是用來調(diào)用父類方法的嘛。單繼承在單繼承中就像大家所想的那樣,主要是用來調(diào)用父類的方法的。你覺得執(zhí)行下面代碼后,的值是多少呢執(zhí)行結(jié)果如下這個(gè)結(jié)果說明了兩個(gè)問題確實(shí)調(diào)用了父類的方法。 說到 super, 大家可能覺得很簡單呀,不就是用來調(diào)用父類方法的嘛。如果真的這么簡單的話也就不會(huì)有這篇文章了,且聽我細(xì)細(xì)道來。? 約定 在開始之前我們來約定一下本文所使用的 ...
摘要:有著一堆神秘的語法和過時(shí)的功能。我試圖列出一些鮮為人知的特性。雖然它們很酷,但畢竟是鮮為人知的特性,你的同事可能會(huì)看不懂。類似這樣使用的話會(huì)始終保持返回正確的。 By Viral Shah | Nov 26, 2018 原文 js一門很容易入門但是很難精通的語言。我很認(rèn)同這句話。這是因?yàn)閖s是一門古老的語言同時(shí)也是一門很靈活的語言。有著一堆神秘的語法和過時(shí)的功能。我已經(jīng)使用js很多年了...
摘要:熟悉的人都知道,提供兩種包含預(yù)定義增刪改查操作的接口對(duì)比這兩個(gè)接口,操作都差不多,名字有一點(diǎn)點(diǎn)改變,比如里面叫的方法,在里面叫。另外還有一種方式就是通過把暴露出來這個(gè)也是的實(shí)例。這樣的話,使用的時(shí)候就只需要引用一個(gè)對(duì)象了 熟悉 mybatis-plus 的人都知道,mybatis-plus 提供兩種包含預(yù)定義增刪改查操作的接口: com.baomidou.mybatisplus.co...
閱讀 1389·2021-11-15 18:11
閱讀 2516·2021-08-19 10:56
閱讀 685·2021-08-09 13:42
閱讀 800·2019-08-30 15:53
閱讀 2091·2019-08-30 10:55
閱讀 3149·2019-08-29 17:18
閱讀 1441·2019-08-29 13:45
閱讀 552·2019-08-29 13:15