Преобразование кода Python в PHP - PullRequest
12 голосов
/ 07 ноября 2010

Существует ли программный конвертер, который может автоматически конвертировать этот код Python в PHP?

#!/usr/bin/python
import math

def calcNumEntropyBits(s):
        if len(s) <= 0: return 0.0
        symCount = {}
        for c in s:
                if c not in symCount: symCount[c] = 1
                else: symCount[c] += 1
        entropy = 0.0
        for c,n in symCount.iteritems():
                prob = n / float(len(s))
                entropy += prob * (math.log(prob)/math.log(2))
        if entropy >= 0.0: return 0.0
        else: return -(entropy*len(s))

def testEntropy(s):
        print "Bits of entropy in '%s' is %.2f" % (s, calcNumEntropyBits(s))

testEntropy('hello world')
testEntropy('bubba dubba')
testEntropy('aaaaaaaaaaa')
testEntropy('aaaaabaaaaa')
testEntropy('abcdefghijk')

Ответы [ 6 ]

14 голосов
/ 07 ноября 2010

Я не знаю ни одного конвертера Python-to-PHP в дикой природе, но портирование должно быть тривиальной задачей, и сходство довольно легко обнаружить:Строки в первой функции могли также быть написаны как стандартное троичное выражение PHP:

return ($entropy >= 0.0)? 0.0: -($entropy*strlen($s));
7 голосов
/ 29 ноября 2015

Я создал преобразователь python-to-php под названием py2php . Он может автоматически переводить основную логику, а затем вам нужно будет настроить вызовы библиотек и т. Д. Все еще экспериментально.

Вот автоматически сгенерированный PHP из питона, предоставленный OP.

<?php
require_once('py2phplib.php');
require_once( 'math.php');
function calcNumEntropyBits($s) {
    if ((count($s) <= 0)) {
        return 0.0;
    }
    $symCount = array();
    foreach( $s as $c ) {
        if (!$symCount.__contains__($c)) {
            $symCount[$c] = 1;
        }
        else {
            $symCount[$c] += 1;
        }
    }
    $entropy = 0.0;
    foreach( $symCount->iteritems() as $temp_c ) {
        $prob = ($n / float(count($s)));
        $entropy += ($prob * (math::log($prob) / math::log(2)));
    }
    if (($entropy >= 0.0)) {
        return 0.0;
    }
    else {
        return -($entropy * count($s));
    }
}

function testEntropy($s) {
    pyjslib_printFunc(sprintf('Bits of entropy in \'%s\' is %.2f', new pyjslib_Tuple([$s, calcNumEntropyBits($s)])));
}

testEntropy('hello world');
testEntropy('bubba dubba');
testEntropy('aaaaaaaaaaa');
testEntropy('aaaaabaaaaa');
testEntropy('abcdefghijk');

Он не будет работать правильно из-за математического импорта и __contains__, но их будет достаточно легко исправить вручную.

6 голосов
/ 07 ноября 2010

Я почти наполовину закончил создание интерпретатора PHP на Python, и я могу с уверенностью сказать, что существуют буквально десятки основных крайних случаев, которые используют тысячи возможностей, которые делают практически невозможным перенос Python наPHP.Python имеет гораздо более надежную грамматику, чем PHP, и, в то же время, еще более продвинут в языке, stdlib Python, вероятно, один из самых продвинутых по сравнению с любым другим языком в своем классе.

Моя рекомендация состоит в том, чтобы ответить на ваш вопрос в один шаг.далее, назад, почему вам нужен набор логики на основе Python в PHP.Альтернативы попыткам перенести / перевести ваш код могут включать в себя подпроцессирование из PHP в Python, использование Gearman, чтобы Python работал в бэкэнде, пока PHP обрабатывает логику представления, или гораздо более сложное решение - реализация служебной шины или очереди сообщений междуприложение PHP и службы Python.

PS.Извиняюсь за любые проблемы с читабельностью, заканчивая 2-дневный спринт только сейчас.

2 голосов
/ 07 ноября 2010

Нет такого инструмента, вам придется портировать код самостоятельно

1 голос
/ 23 мая 2014

Я задавался этим вопросом, и нашел этот файл PyToPhp.py на сайте GitHubGist.Это просто и кажется отправной точкой для начала.

Я собираюсь взглянуть на это !!!

0 голосов
/ 10 февраля 2019

Я изменил библиотеку py2php с https://github.com/dan-da/py2php и раздвоил ее в новый репозиторий на https://github.com/bunkahle/py2php Теперь вы также можете использовать математическую библиотеку python, которая переведена в код PHP.Тем не менее, чтобы заставить его работать, вам нужно адаптировать свой код.

...