2010-11-07 2 views
10

Есть ли программный конвертер, который может автоматически преобразовать этот код Python в PHP?Преобразование кода 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') 
+0

Выходит, что «программный конвертер» был пользователем по-прежнему. –

+1

Ha. Переполнение стека требует метода API, в котором вы можете отправить PHP-код и вернуть Python! – JAL

+1

@JAL [Universal-transpiler] (https://github.com/jarble/universal-transpiler) может преобразовать небольшое подмножество языка программирования PHP в Python. Тем не менее, это все еще работает. –

ответ

13

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

function calcNumEntropyBits($s) { 
     if (strlen($s) <= 0) return 0.0; 
     $symCount = array(); 
     foreach (str_split($s) as $c) { 
       if (!in_array($c,$symCount)) $symCount[$c] = 1; 
       else $symCount[$c] ++; 
     } 
     $entropy = 0.0; 
     foreach ($symCount as $c=>$n) { 
       $prob = $n/(float)strlen($s); 
       $entropy += $prob * log($prob)/log(2); 
     } 
     if ($entropy >= 0.0) return 0.0; 
     else return -($entropy*strlen($s)); 
} 

function testEntropy($s): 
     printf("Bits of entropy in '%s' is %.2f",$s,calcNumEntropyBits($s)); 

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

последние несколько строк в первой функции могли бы также были написаны в качестве стандартного PHP тройном выражения:

return ($entropy >= 0.0)? 0.0: -($entropy*strlen($s)); 
+1

Это хорошо, но вы не можете перебирать строку с помощью 'foreach' в PHP. Вы должны использовать 'for' с цифровыми клавишами. Как бы то ни было, этот код дает «Недопустимый аргумент, предоставленный для ошибки foreach()». – JAL

+3

Вы можете перебирать строку, используя foreach. Код, отредактированный – stillstanding

+0

@ отлично, да, конечно, вы можете, если сначала преобразовать его в массив. Однако, как я уже отмечал, это не сырая строка. – JAL

2

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

6

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

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

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

1

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

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

6

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

Здесь вы можете автогенерировать PHP из python, предоставленного 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__, но те, будет достаточно легко исправить вручную.

+0

замечательная работа ....... – luky

Смежные вопросы