Se connecter
Se connecter

ou
Créer un compte

ou
Agrandir
Les Mains dans le Cambouis
Bidouille & Développement Informatique

Sujet Le pub des programmeurs

  • 1 925 réponses
  • 117 participants
  • 119 082 vues
  • 130 followers
1 Le pub des programmeurs
Salut :coucou: y a des programeurs sur AF si oui vous bossez sous quoi ?
Afficher le premier post
1671
Cool :bravo:

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

1672
A oui , du très lourd JUCE 5
1673
Je remets pour les gens intéressés (il semblait y en avoir) : https://github.com/mbrucher/AudioTK-book/releases
Pour les remarques, merci d'utiliser github directement, plus simple pour centraliser les critiques constructives !
1674
Salut les gens !

Je suis en train d'organiser les stages de formation accélérés sur JUCE, si jamais ça vous intéresse j'aimerais savoir si vous pourriez répondre à un petit sondage, pour m'aider à cibler le contenu. Ca sera sur Paris après la rentrée scolaire :bravo:

https://fr.surveymonkey.com/r/QNZVMYH

Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape

1675
Hello à tous ! J'ai une petite question de Python

J'ai un banc de mesure que j'aimerais automatiser un peu et pour ça je voudrais utiliser python. L'aspect communicaiton avec les appareils est assez facile à gérer, à l'aide d'une librairie spéciale, et tous les appareils causent à peu près le même langage (du SCPI pour ceux qui connaissent)

Bref, j'aimerais programmer un truc un peu propre, et surtout facilement réutilisable pour d'autres projets qui utilisent les mêmes appareils. Je pensais donc créer des librairies permettant à mon application de causer très facilement avec mes appareils.

Bref, j'en suis arrivé à faire quelque chose de ce style
import visa

def smbv100a_init(ip_adress):
    rm = visa.ResourceManager()
    my_SMBV = rm.get_instrument("TCPIP::"+ip_adress+"::inst0::INSTR")
    identity = my_SMBV.query('*IDN?')
    identity = identity.split(',') #Séparation des mots le modèle de l'appareil se situe dans la première case du tableau identity
    if (identity[1] == 'SMBV100A'):
        return 1
    else:
        return 0

def smbv100a_set_RF_ON():
    my_SMBV.write('OUTP ON')


mais du coup sur la deuxième définition il me dit qu'il ne connais pas la variable my_SMBV. Ce qui est logique vu que je la définie dans la fonction d'init juste au dessus. Comment est ce que je peux faire pour qu'il fasse bien le lien entre "les deux" ? J'avais pensé à utiliser une variable globale, mais bon, si il y a des solutions plus propres, je suis preneur.

Merci !
1676
Citation :
J'avais pensé à utiliser une variable globale

Non. Ça c'est mal, et ce serait étonnant que tu ne finisses pas par le regretter.

Tu peux le faire via une programmation objet. Ou alors, ce qui revient à peu près au même, mais c'est moins élégant, passer sans arrêt en paramètre une structure qui contient les données dont tu as besoin.



Ceci n'est qu'un ´up' déguisé, car je pratique extrêmement peu Python. :oops2:

[ Dernière édition du message le 27/06/2017 à 20:25:48 ]

1677
+1 pour la programmation objet dans ce contexte.
En règle générale je ne suis pas fan de l'oo, mais là ca s'applique bien. Tu fais une classe par type d'instrument, avec dedans ta variable qui du coup est globale-mais-pas-trop, et des méthodes qui font ce que tu as à faire : initialiser, lire, changer de mode, etc.
Tu peux même factoriser les trucs communs dans une classe "instrument" dont hériteraient tes classes d'instruments particuliers.
1678
Une variable globale n'est pas forcément une mauvaise chose en soi.
C'est comme goto, ça peut faire le job et parfois c'est ce qui donnera la solution la plus simple et la plus lisible.
C'est généralement déconseillé mais si la portée de cette variable est limitée à ton fichier, si tu sais qu'il n'y aura jamais qu'une seule instance de cette variable et pas d'effets de bord, ça peut faire du code plus simple à lire (et ça c'est un des critères les plus importants).

Sinon, pour rebondir sur l'idée de Dr Pouet, cherche du côté de **kwargs pour passer un Dict en paramètre à une fonction.
C'est assez élégant et facile à lire une fois qu'on a compris le principe.

EDIT: et rien ne t'empêche de passer par une globale dans un premier temps pour vérifier que ton programme fonctionne, puis d'améliorer le design avec une classe dans le futur.

First make it work, then make it good, finally, make it awesome

EDIT 2: ou alors, ta fonction d'init retourne ta variable ou un tuple avec plusieurs variables, et c'est ça qui sera le paramètre de ta fonction.


def init():
    # initialize stuff
    if something_bad_happens():
        return None, None
    return x, y

def process(x, y):
    #do something awesome with x and y

if __name__ == "__main__":
    from sys import exit
    x, y = init()
    
    if x is None or y is None:
        exit("something bad happened")
    
    process(x, y)

Resistance is not futile... it's voltage divided by current

[ Dernière édition du message le 27/06/2017 à 20:56:05 ]

1679
Citation :
First make it work, then make it good, finally, make it awesome
Bof... On s'expose à rustiner encore et encore une archi qui aurait dû être pensée dès le début.

En fait, je ne vois pas trop ce que l'on gagne en lisibilité et en simplicité à ne pas partir directement sur une programmation objet.
1680
Ok, bon j'ai commencé à faire ça en poo du coup (première fois que j'en fait)

Voici ce que j'ai fait


Class monInstrument (object)
 Def __init__(self, ip_adress, visa)
 #blablablabla

 Def read_output_state 
 Return self._query('OUTP?')


Lorsque je crée mon instrument ça marche j'arrive à m'y connecter. Mais si par exemple je veux lire sa sortie j'ai un message d'erreur :

Moninstrument instance has nous attribuer 'query'

Ce que j'avais fait
Import visa
Import moninstrument_driver
test = moninstrument_driver.moninstrument("192.168.xx.xx")
test.read_output_state()

Quelqu'un voit ce que c'est ? En gros je pense qu'il ne comprends pas le 'query' dans la méthode read_output_state