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