Esta p谩gina es una ayuda a los programadores que vienen del mundo "visual" (VB cl谩sico versiones 5.0 y 6.0)
VB.NET es otro lenguaje, por lo que esta comparaci贸n no se adecua (buscar Python vs .Net)
Diferencias entre Python y VB
Tipado
Python es fuertemente tipado, VB no. En VB se puede hacer 1 +"2" = 3, en python hay que convertir explicitamente los tipos: 1 + int("2") = 3 (esto evita errores del tipo "1" + "1" + 2 que en VB da 13 en vez de 4 o "112"). Para los tipos similares (ej enteros y flotantes) no hace falta conversi贸n (ni en Python ni en VB). Adicionalmente, en python se puede modificar el comportamiento de las operaciones aritmeticas y booleanas dependiendo del tipo del los objetos involucrados.
Python es tipado din谩micamente, VB depende de la declaraci贸n de la variable (en python todas las variables equivalen al tipo
Variant
de VB, o sea, pueden adquirir cualquier tipo de datos). En VB no se puede cambiar el tipo de la variable en tiempo de ejecuci贸n si no sonVariant
(no se puede asignar un flotante a un entero), en Python no existe esta restricci贸n.En Python no se puede utilizar variables indefinidas o sin inicializar, en VB si (mas all谩 de la instrucci贸n
Option Explicit
que solo obliga a definir las variables, no a inicializarlas). En VB, a las variables sin inicializar se les asigna un valor impl铆cito en el "aire" dependiendo del contexto (0, "", etc.), lo que permite usar variables inexistentes con valores indefinidos (una de las causas del c茅lebre error "No coinciden los tipos").En Python no se define el tipo de la variable (ver tipado din谩mico), solo basta con inicializar su valor (o None si no lo tiene). En VB en general es necesario hacer dos pasos, definir el tipo (
Dim var As tipo
) e inicializar la variable (salvo que el valor inicial sea el predeterminado que se le asigna implicitamente seg煤n el tipo, ej. enteros = 0). En general, se define el tipo para inicializarla con el valor predeterminado (para evitar el problema del punto anterior), perdiendo el dinamismo del lenguaje.
Tipos de datos
Python soporta nativamente cadenas (
string
/unicode
equivalente aString
en VB), enteros (int
/long
equivalentes aByte
/Integer
/Long
de VB), n煤meros de punto flotante (float
equivalentes a Single/Double de VB), booleanos (bool
True y False 铆dem que en VB). Tambien en la librer铆a estandar se encuentra los tiposdatetime
para fechas (Date
/Time
en VB), yDecimal
para numeros con presici贸n fija (similar aCurrency
en VB)En Python hay un solo tipo de objeto nulo:
None
. En VB existeNothing
para objetos por referencia (mutables),Null
para valores nulos (dentro de variables sin tipo),Empty
para variables no definidas (no son posibles en Python),Missing
para par谩metros opcionales no pasados a la funci贸n. En Python cualquier variable puede se nula, en VB solo las variables sin tipo (causa del c茅lebre error "Uso de null no v谩lido").VB soporta colecciones (
Collection
) similares a los diccionarios (dict
) de Python. En comparaci贸n, los diccionarios son m谩s poderosos, tienen un m茅todo para ver si una clave esta definida (en VB la 煤nica forma de saberlo es tratar de obtener dicha clave y ver si se produc铆a un error), se pueden recorrer sus claves (en VB solo es posible recorrer sus valores:For Each val in coleccion
). En VB se pueden usar colecciones sin clave, que ser铆an el equivalente a las Listas (list
) de Python. En VB, las claves deben ser cadenas, ya que si se utiliza n煤meros enteros se accede por posici贸n. En Python no se puede acceder directamente por posici贸n en los diccionarios (habr铆a que obtener una lista de los valores) y las claves pueden ser cualquier valor inmutable (cadenas, enteros, etc.)Python no soporta arreglos o vectores nativamente. En VB los vectores o arreglos de longitud fija o variable ser铆an el equivalente a las listas de Python, los cuales pueden ser redimensionados (preservando su valor o no,
Redim Preserve arreglo()
). Los arreglos de VB solo se pueden recorrer por posici贸n (en Python por posici贸nlista[pos]
y por comprensionfor elem in lista
) y no se puede "recortar" facilmente un subconjunto de elementos (en Python:lista[pos_inicial:pos_final]
). En vez de listas tambien se pueden utilizar arreglos con el m贸duloarray
.En Python no existen Constantes (
Const
en VB). Simplemente se definen como variables globales.
Funciones y Subrutinas
En Python no hay diferencia entre funciones y subrutinas (estas 煤ltimas en VB no devuelven resultado) y es obligatorio el uso de par茅ntesis para las llamadas, aunque no tenga par谩metros o no se use el resultado devuelto (siempre devuelven un valor aunque no se lo utilize, si no se especifica devuelven None).
En Python los par谩metros se pueden pasar por nombre y/o por posici贸n, y los parametros optativos (por nombre) directamente no se pasan ni se dejan en blanco.
Python no soporta variables est谩ticas (variables definidas dentro del contexto de una funci贸n, cuyo valor perdura entre los distintos llamados), pero si soporta generadores (donde se puede ir devolviendo resultado sin salir de la funci贸n, preservando los valores de las variables locales). Tambien se podr铆a utilizar parametros opcionales mutables (ej. listas), que persisten entre llamados a la misma funci贸n.
Orientaci贸n a Objetos
Si bien ambos son lenguajes multiparadigma, en python se puede programar funcionalmente adem谩s del modo procedural y orientado a objetos, con muy buenas herramientas de introspecci贸n y metaprogramaci贸n.
Python soporta herencia (m煤ltiple), constructores con par谩metros, metodos de clase y est谩ticos, por lo que es un lenguaje m谩s amigable desde el punto de vista de Orientaci贸n a Objetos. Las variables y m茅todos privados en python son semi-publicos, y python no soporta interfaces (aunque se pueden emular). Ambos soportan metodos y variables de instancia y propiedades.
Python no soporta atributos/propiedades por defecto. En VB, si no se especifica atributo, en general hay uno por defecto. Ej.
col('hola')
en una colecci贸n en realidad esta accediendo al m茅todo Item:col.Item('hola')
. Esto es similar a la sintaxis de Python para los diccionarios:dic['hola']
es similar adic.__getitem__('hola')
, pero en VB tiene un uso implicito mucho mas extendido.
Referencias
Python no distingue entre manejo por referencia y por valor, pero si entre tipos mutables e inmutables. Los tipos mutables (listas, diccionarios y objetos del usuario) se utilizan siempre por "referencia". Los tipos inmutables (enteros, flotantes, cadenas) se utilizan siempre por "valor".
En Python, los tipos mutables (por "referencia") se asignan de la misma manera que los tipos inmutables (por "valor"). No hay una distinci贸n expl铆cita como en VB donde es necesario utilizar la instrucci贸n
Set variable = valor
, ni en los argumentos con los modificadoresByValue
yByRef
.
M贸dulos y Alcances
En Python no hay distinci贸n entre archivos fuente de formularios, m贸dulos, m贸dulos de clase, etc. (todos reciben el nombre de m贸dulo) y tampoco existe la restricci贸n de una clase por m贸dulo (como en los formularios y m贸dulos de clase de VB).
En Python tampoco se distingue entre Referencias y Componentes, manejando estas caracter铆sticas como m贸dulos y clases que se deben importar para poder utilizarlos.
En Python si bien existen los alcances Globales y Locales, el global solo es para el m贸dulo en el que se esta trabajando (debiendo importar expl铆citamente los nombres a utilizar de otros m贸dulos). Esto es similar a
modulo.variable
de VB, pero los m贸dulos no se importan ni crean autom谩gicamente.En Python, en general, para modificar variables globales dentro de una funci贸n, se debe declarar la variable como global (instrucci贸n
global
), de lo contrario se crea una variable local (aunque la variable global exista).
Sintaxis
En Python la identaci贸n es obligatoria para definir los bloques, en VB es opcional y no define los bloques.
Python no utiliza delimitadores de bloque: ni llaves ni palabras claves (
End For
,End If
, etc. de VB).En Python para separar varias instrucciones se puede utilizar el punto y coma (dos puntos en VB). Este no delimita el final de la linea, ya que solo se puede hacer una instrucci贸n multilinea terminando la linea que continua con una (guion bajo en VB) salvo excepciones (textos multiples lineas con
"""
o cuando se abre un par茅ntesis)Python no soporta la instruci贸n de "comparaci贸n m煤ltiple" (
Select
en VB), se pueden utilizar variosif
o un dicionario.Python no soporta ciclos "repetitivos" de manera directa (
For i = 1 To 10 Step 2
en VB), siempre se debe recorrer listas (for i in xrange(1,10,2)
en Python).Python tiene solo una forma de ciclos condicionales (
while
), y se evalua siempre al comienzo del ciclo (similar alDo While condici贸n
de VB, peroWhile
no se soporta al final del ciclo.)Python es sensible a may煤sculas y min煤sculas, VB no (para bien o para mal...). Igualmente, VB "corrige" may煤sculas y min煤sculas a medida que se escribe (esto es 煤til para ver si est谩 definida la variable o no, pero tambien trae problemas si se redefinia la variable en otro contexto, cambia el nombre en el resto de los m贸dulos). En Python, hay que escribir bien desde el principio el nombre de la variable.
Entorno de desarrollo integrado (IDE) y Migraci贸n
En Python, no existe "脡l" entorno de desarrollo integrado (Editor de C贸digo y de Pantallas, Compilador, Depurador, etc.). Hay varias herramientas, que pueden llegar a usarse en conjunto (por ej. StaniPythonEditor es un editor + wxGlade para dise帽ar pantallas + WinPdb para depurar + PyChecker para verificar el c贸digo, etc.). Ver SPE, Boa, etc.
Para el desarrollo r谩pido y simple, lo m谩s parecido es PythonCard, que incluye un dise帽andor de pantallas y editor de c贸digo muy similar a VB, y el manejo de componentes es muy simple.
Existe una herramienta para migrar c贸digo VB a Python: vb2py, migra proyectos simples con relativa facilidad, y puede ser usada como referencia para ver la conversi贸n entre el c贸digo de ambos lenguajes, documentado en la gu铆a del usuario.