成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

你沒看錯(cuò):Swift可以直接調(diào)用Python函數(shù)庫

Terry_Tai / 3066人閱讀

摘要:上周又推出了新一輪服務(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-dev
MacOS 編譯事項(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? Stringlet 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

相關(guān)文章

  • Java爬蟲之利用Jsoup自制簡單的搜索引擎

    摘要:的官方網(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:...

    GHOST_349178 評(píng)論0 收藏0
  • 簡單瞅瞅Python assert 語句

    摘要:寫在前面最近每日一更,我這菜雞都有點(diǎn)兒不好意思了簡單介紹簡單用法是讓我們用程序來測試這個(gè),如果相當(dāng)于,那么一個(gè)出來。 寫在前面 最近每日一更,我這菜雞都有點(diǎn)兒不好意思了 簡單介紹 簡單用法是: assert expression 讓我們用程序來測試這個(gè)expression,如果expression相當(dāng)于False,那么raise一個(gè)AssertionError出來。即邏輯上等同于: i...

    2json 評(píng)論0 收藏0
  • super 沒那么簡單

    摘要:說到,大家可能覺得很簡單呀,不就是用來調(diào)用父類方法的嘛。單繼承在單繼承中就像大家所想的那樣,主要是用來調(diào)用父類的方法的。你覺得執(zhí)行下面代碼后,的值是多少呢執(zhí)行結(jié)果如下這個(gè)結(jié)果說明了兩個(gè)問題確實(shí)調(diào)用了父類的方法。 說到 super, 大家可能覺得很簡單呀,不就是用來調(diào)用父類方法的嘛。如果真的這么簡單的話也就不會(huì)有這篇文章了,且聽我細(xì)細(xì)道來。? 約定 在開始之前我們來約定一下本文所使用的 ...

    xiguadada 評(píng)論0 收藏0
  • 鮮為人知的JavaScript功能

    摘要:有著一堆神秘的語法和過時(shí)的功能。我試圖列出一些鮮為人知的特性。雖然它們很酷,但畢竟是鮮為人知的特性,你的同事可能會(huì)看不懂。類似這樣使用的話會(huì)始終保持返回正確的。 By Viral Shah | Nov 26, 2018 原文 js一門很容易入門但是很難精通的語言。我很認(rèn)同這句話。這是因?yàn)閖s是一門古老的語言同時(shí)也是一門很靈活的語言。有著一堆神秘的語法和過時(shí)的功能。我已經(jīng)使用js很多年了...

    luckyw 評(píng)論0 收藏0
  • mybatis-plus 的一種很別扭的用法

    摘要:熟悉的人都知道,提供兩種包含預(yù)定義增刪改查操作的接口對(duì)比這兩個(gè)接口,操作都差不多,名字有一點(diǎn)點(diǎn)改變,比如里面叫的方法,在里面叫。另外還有一種方式就是通過把暴露出來這個(gè)也是的實(shí)例。這樣的話,使用的時(shí)候就只需要引用一個(gè)對(duì)象了 熟悉 mybatis-plus 的人都知道,mybatis-plus 提供兩種包含預(yù)定義增刪改查操作的接口: com.baomidou.mybatisplus.co...

    Rocko 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<