python
  • syntax
  • 2010-04-30 6 views 34 likes 
    34

    Dada una cadena "var = valor" Quiero dividirlo (sólo) en el primera signo '=' (< valor> puede contener signos más '='), algo como esto:Python: ¿hay un símbolo de "no me importa" para las asignaciones de tuplas?

    var, sep, value = "VAR=value".partition('=') 
    

    ¿Hay alguna manera de NO declarar una variable 'sep'? Como esta (que acaba de hacer la sintaxis):

    var, -, value = "VAR=value".partition('=') 
    

    simplemente para la corrección, estoy apuntan a Python v 2.6

    +0

    Probablemente vale la pena señalar aquí en los comentarios que en este caso, realmente usaría 'split' en lugar de' partition'. Es decir, 'var, value = 'VAR = value'.split ('=') '. Bueno, ejemplo sucinto sin embargo. –

    +0

    @Cody 'split' solo funciona en este caso con un argumento maxsplit. 'partition' parece ser el preferido. Consulte los comentarios a continuación http://stackoverflow.com/a/2745082/11545 para obtener más información de personas con más conocimiento que yo –

    +0

    El argumento 'maxsplit' especifica ** cuántas divisiones ** se realizan, por lo que se usará' maxsplit = 1' aquí, es decir, como mucho uno se divide en dos piezas como máximo. Esto puede ser confuso porque algunos otros lenguajes de scripting (Perl, PowerShell, etc.) usan un parámetro similar para especificar en su lugar cuántas subcadenas se crean, por lo que el argumento en esos casos sería 2 en lugar de 1. Esto debe ser una fuente de sutilidad errores al portar scripts. – ghostarbeiter

    Respuesta

    38

    _ es de hecho una elección muy popular para "un nombre que no importa" - es un nombre legal, visualmente discreto, etc. Sin embargo, a veces estas mismas cualidades que pueden obstaculizar. Por ejemplo, el módulo de GNU gettext para I18N y L10N, que es parte de la biblioteca estándar de Python, idiomáticamente utiliza _ de manera muy diferente, con expresiones tales como ...:

    _ = gettext.gettext 
    # ... 
    print _('This is a translatable string.') 
    

    para marcar y traducir toda la cadena literal mensajes en el código (también explotar la escasa presencia visual relativa de _('...'). Obviamente, cualquier código que utiliza este módulo e idioma no debería también estar utilizando _ a significar algo completamente diferente ("un no me importa el nombre").

    Así una segunda alternativa útil puede ser dedicar el nombre unused para indicar situaciones de "no me importa" en un e manera explícita. Google de python style guide recomienda el uso de ya sea _ o una prefijo de unused_ - el último puede ser un poco verbosa pero tiende a ser muy claro, por ejemplo:

    name, unused_surname, salutation = person_data 
    print "Hello, %s %s!" % (salutation, name) 
    

    hace cristalinas que person_data es una secuencia de tres ítems (probablemente una tupla) y el elemento que está omitiendo (y que no usa) es el apellido (porque desea imprimir un mensaje amistoso como "¡Hola, señor Alex!" o "¡Hola, señorita Piggy!" ;-) . (pylint y herramientas similares pueden advertirle si tiene variables no utilizadas nombradas de otra manera que _ o unused_..., y por supuesto también le advierto si alguna vez haga use una variable llamada unused_something! -).

    +0

    Buen punto en gettext, creo que podría haberlo hecho alguna vez sin darme cuenta. – guival

    14

    Casi allí:

    var, _, value = "VAR=value".partition('=') 
    

    _ convencionalmente se considera un no hacer -care variable

    +1

    Por curiosidad, ¿cuál es la convención para múltiples no importa? ¿Simplemente sigues agregando caracteres '_'? ¿O reutilizar el mismo nombre '_'? –

    +3

    @Hank: solo puede volver a utilizar el guion bajo individual, también si esas variables vienen en una secuencia, puede empaquetarlas nuevamente en una tupla, como esta: 'a, * _, e = range (5)'. En py2k '* _' solo puede ser el último parámetro – SilentGhost

    +6

    Creo que está equivocado: Python 2.x no permite esta sintaxis de asignación en absoluto. –

    4

    No hay nada oficial en el idioma para eso; puedes usar cualquier variable descartable. En cuanto a los estándares, he visto guiones bajos utilizados ocasionalmente en Python y otros idiomas. El único problema es que el subrayado se usa como un alias para gettext al localizar. Pero si no está haciendo la localización, o no está utilizando el enlace global para ello, el guión bajo debería funcionar bien.

    3

    realmente extraña pregunta, porque se puede hacer simplemente:

    var, _, value = s.partition(sep) 
    

    y no se preocupan por _ variable, pero _ es sólo un nombre como sep, como var o value. Por cierto uso str.split

    >>> var, value = "VAR=value".split('=') 
    >>> var, value 
    ('VAR', 'value') 
    >>> 
    
    +1

    'str.split' es mucho más lento y' str.partition' está diseñado exactamente para esta situación. – SilentGhost

    +0

    @SilentGhost: es bueno saberlo. –

    +0

    @ Silent Guys, 'str.partition' se divide solo en la ** primera ** aparición de 'sep', entonces si tengo var, _, value =" AAA = bbb = ccc ", se le asignará el valor 'bbb = ccc 'que es lo que quiero; 'str.split' se divide en ** cada ** aparición de 'sep'; hay más diferencias, mira los documentos. http://docs.python.org/release/2.5.2/lib/string-methods.html –

    2

    ¿Por qué no usar 'VAR=value'.split('=') en su lugar? Eso ignora el delimitador.

    EDITAR (para acomodar el ejemplo de Cristi en el comentario):

    De Diving into Python:

    Consejo: anystring .split (delimitador, 1) es una técnica útil cuando desea buscar una cadena para una subcadena y luego trabajar con todo antes de la subcadena (que termina en el primer elemento de la lista devuelta) y todo lo que queda después (que termina en el segundo elemento).

    +3

    porque puede contener más '=' caracteres, y solo quiero dividir en el primero. –

    +1

    Pruebe ''VAR = value = full = of = equal = signs'.split (' = ', 1)'. – PaulMcG

    2
    • Python no tiene sintaxis para evitar asignación en el desembalaje y tal.

    • Como han mencionado otros, existe la convención de usar _ para las variables que no le interesan. Esto se usa y se entiende bastante ampliamente, pero personalmente creo que está infrautilizado. Si dices var, _, value = "VAR=value".partition('='), tienes que saber qué está pasando para saber qué era _ y por qué no te importaba cuando lees el código. Si dice var, sep, value documenta al mismo tiempo.Esto no es muy importante para str.partition, pero he visto _, _, name, _, city, _ = some_weird_function() anteriormente y me pareció menos útil que si todo se desempaquetara en nombres útiles.

    • Puede técnicamente usar str.split aquí si lo desea. var, value = "foo=bar=baz".split("=", 1).

    1

    El _ se usa comúnmente como nombre para usted no importa * Por ejemplo, en una tupla que contiene el nombre, apellido y apodo en un momento en el que estamos interesados ​​solo en nombre y apellido, podríamos usar _ para indican que el nombre no es importante en este punto:

    data = ('John', 'Mate', 'Little John') 
    name, surname, _ = data 
    
    0

    Como han dicho otros, ponen de relieve (_) es el estándar. Pero si el subrayado se está utilizando para las traducciones, creo que el doble guión bajo es la mejor alternativa.

    var, __, value = "VAR=value".partition('=')

    mejor que estos:

    var, unused, value = "VAR=value".partition('=')

    var, unused_del, value = "VAR=value".partition('=')

    var, _del, value = "VAR=value".partition('=')

    0

    También existe la opción de usar índices:

    a, b = my_list[0, 2] 
    
    Cuestiones relacionadas