Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

const

12 réponses
Avatar
JBB
Je cherche un moyen de faire l'équivalent d'un const en C/C++.
ceci afin d'éviter la modification de certains objets par d'autres.

ex:
class Maclass(object):
def __init__(self):
self.x = 1
def reset(self):
self.x = 0

def f(i):
i.reset()

x = Maclasse()
f(x)
#j'aimerais être sur que l'appel de f ne modifie pas x
et donc empêcher que f appelle reset()

Voici l'état de mes réflexions:
Je peux faire de Maclasse un type 'terminal' comme str ou tupple que l'on ne peut pas modifier, mais je trouve cette solution
contraignante.
Soit je passe a f un copie de x ( ce que je trouve contraignant aussi, en plus d'être peut performant), de plus ça n'empêchera
pas f de modifier ma copie (pour rien).
Soit avant d'appeler f je supprime la methode reset() de x et je la remet après (?)
Sinon, à la Java je pourrais passer a f seulement une interface sur x ( mais cela ne doit pas avoir de sens en Python)

Bref je cherche une solution à la fois propre et performante.

2 réponses

1 2
Avatar
jean-michel bain-cornu
Bon ben faut que je m'invente des petits trucs à faire en Python...
Je suis en train de finir un logiciel de gestion de support

(http://www.jmbc.fr/jwiki/wxQueries) que je met en gpl. Si tu veux, il y
a encore pas mal de boulot...

Avatar
tool69
Désolé pour le bouton, depuis que je suis passé à cet écran Wide, j'ai
un peu de mal avec les caractères tout petits.

Bon, sinon voilà un des scripts que j'ai écris :

---------------------
#!/usr/bin/env python
# -*- coding: latin1 -*-

import string

STARTER = "${"
ENDER = "}"

def parse(template):
state = 0
opened_brack = 0
static = ""
fields = []
starts = []
j=0
print 'Examining n', template,'n'
for c in template :
i=j
#print 'examine',c,'starts',starts,i
if c == '$' :
state = 1
elif c == '{' and state == 1 :
opened_brack += 1
starts.append(i-1)
elif c == '}' :
st = starts.pop()
fields.append( [st, template[st+len(STARTER):i] ,
opened_brack-1])
opened_brack -= 1
state = 0
else :
if state == 0 :
static += c
j += 1
print 'Static Textnt',static,'n'
return fields

tpl = "Un ${1:truc} avec son ${2:${3:bidule} dans un
${4:${5:${6:machin}}}}."

for el in parse(tpl) : print el
---------------------

Ca marche,


Tel que, ça ne correspond pas à ton cahier des charges.

mais bon, je trouve ça un peu 'bidouille'


Le fait de faire le parsing à la mano, dans un cas aussi simple, n'est
pas nécessairement de la bidouille en soi. Par contre, ton code est AMHA
inutilement compliqué.

START = "${"
END = "}"

_start_len = len(START)
_end_len = len(END)

def parse(template):
fields = []
fields_starts = []

for position, _ in enumerate(template):
if template[position:position + _start_len] == START:
fields_starts.append(position)
elif template[position:position + _end_len] == END:
depth = len(fields_starts)
if depth:
start = fields_starts.pop()
key, content =
template[start + _start_len:position].split(':', 1)
fields.append((start, int(key), content, depth-1))
return fields

tpl = """
Un ${1:truc} avec son ${2:${3:bidule} dans un ${4:${5:${6:machin}}}}.
"""
for field in parse(tpl):
print field

(3, 1, 'truc', 0)
(26, 3, 'bidule', 1)
(54, 6, 'machin', 3)
(50, 5, '${6:machin}', 2)
(46, 4, '${5:${6:machin}}', 1)
(22, 2, '${3:bidule} dans un ${4:${5:${6:machin}}}', 0)

HTH
Merci Bruno,


Effectivement, c'est beaucoup plus propre et c'est vrai que je
compliquais un peu la chose.

Merci encore pour ton aide:
Kib²


1 2