2010-11-07 27 views
10

¿Existe un convertidor de software que pueda convertir automáticamente este código python en PHP?Conversión de código Python a 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

Desactiva el "convertidor de software". –

+1

Ha. ¡Stack Overflow necesita un método API donde puedas enviar código PHP y recuperar Python! – JAL

+1

@JAL [Universal-transpiler] (https://github.com/jarble/universal-transpiler) puede convertir un pequeño subconjunto del lenguaje de programación de PHP en Python. Sin embargo, todavía es un trabajo en progreso. –

Respuesta

13

No estoy al tanto de cualquier convertidor de Python-a PHP en la naturaleza, pero debe ser una tarea trivial puerto y las similitudes son bastante fáciles de detectar: ​​

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'); 

las últimas líneas de la primera función también podrían haber sido escrito como una expresión ternaria PHP estándar:

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

Esto es bueno, pero no puede iterar sobre una cadena con 'foreach' en PHP. Tienes que usar 'for' con teclas numéricas. Tal como está, este código da un "argumento no válido proporcionado para el error foreach()". – JAL

+3

Puede iterar sobre una cadena usando foreach. Código editado – stillstanding

+0

@stillstanding Bien, sí, por supuesto que puedes hacerlo primero si lo conviertes en una matriz. Sin embargo, no es una cadena en bruto, como noté. – JAL

2

no existe tal herramienta, que tendrá que aportar el código mismo

6

Estoy a la mitad del camino hecho para hacer un intérprete de PHP en Python y puedo decir a grandes rasgos que hay literalmente docenas de casos de gran envergadura que representan miles de posibilidades que harían casi imposible portar Python a PHP. Python tiene una gramática mucho más robusta que PHP, mientras que más adelante en el lenguaje, el stdlib de Python es probablemente uno de los más avanzados en comparación con cualquier otro lenguaje en su clase.

Mi recomendación es llevar su pregunta un paso atrás, a por qué necesita un conjunto de lógica basada en Python en PHP. Las alternativas a intentar portar/traducir su código podrían incluir un subproceso de PHP a Python, usar Gearman para que Python funcione en el back-end mientras PHP maneja la lógica de visualización, o una solución mucho más complicada sería implementar un bus de servicio o cola de mensajes entre una aplicación PHP y servicios de Python.

PS. Disculpas por cualquier problema de legibilidad, terminando un sprint de 2 días en este momento.

1

Me pregunté a mí mismo la misma pregunta, y encontré este archivo PyToPhp.py en el sitio GitHubGist. Es simple, y parece un punto de partida para el comienzo.

¡Voy a echarle un vistazo!

6

Creé un convertidor python-to-php llamado py2php. Puede traducir automáticamente la lógica básica y luego tendrá que modificar las llamadas de la biblioteca, etc. Todavía experimental.

Aquí se genera automáticamente PHP a partir del pitón proporcionado por el 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'); 

No sería funcionar correctamente debido a la importación de matemáticas y __contains__, pero los que sería bastante fácil de solucionar con la mano.

+0

buen trabajo ....... – luky

Cuestiones relacionadas