Anfängerfrage :-P

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PPatrick
User
Beiträge: 3
Registriert: Donnerstag 25. Oktober 2012, 09:29

Hallo zusammen,
Nachdem ich nun Jahrelang Perl, dessen abwandlungen und MS Programmierungen machen durfte, wollte ich mal eben auf Python umsteigen,
denn was ist denn schon schwieriges dabei?! :-P Da habe ich aber noch nicht mit den Eigenheiten dieser Sprache gerechnet, da den Code zu lesen doch recht aufschlussreich galt.,

Meine Frage, nachdem ich an mir zweifelnd Die Docs von V2 und V3 und viele TUTs durchsucht habe ich aber den Wald vor lauter Bäumen nicht sehe, könnt Ihr mir bitte sagen
was da vor meiner Nase klebt und einfach nicht zu finden ist?

Ich möchte eine Instanz Starten und einige Globale Variablen nutzen um verschiedenen Threads oder aber teilweise aus Übersichtlichkeitsgründen definieren, der Code wurde mittlerweilen aus,
"Good Coding Practice" zu -> statischem müll. Also bitte ich darüber hinweg zu sehen.

Welche Vererbung beachte ich nicht?! um eben untenstehende Sub durchzuführen?, da der wert von 0 auf 1 geändert wird, aber bei dem nächsten Aufruf wiederum bei 0 steht sieht es für mich aus wie ein Problem der vererbung, da ich nicht ein aufruf durchführen möchte mit Variable=SUB(Variable).


global CTransIDCurrent
CTransIDCurrent = 1

def request_TransID(CTransIDCurrent):
if CTransIDCurrent == 0 :
CTransIDCurrent=1
return CTransIDCurrent
elif CTransIDCurrent == 9999 :
CTransIDCurrent=1
return CTransIDCurrent
else:
return CTransIDCurrent + 1

Demnach, HIILLFFEEE... ich fühle mich als hätte ich das "sitzen" verlernt.
LG
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

1) Wenn du deinen Code in die entsprechenden Tags setzt, wird er deutlich übersichtlicher.

2) globale Variablen sind (bis auf wenige Ausnahmen) schlechter Stil

3) "global" verwendet man in Funktionen um eine Variable, die nicht in der Funktion definiert wurde quasi "beschreibbar" zu machen. Immer wenn man das schreiben muss damit ein Code funktioniert, sollten eigentlich alle Alarmglocken angehen.

4) Du übergibst der Funktion einen Parameter, der den selben Namen hat wie eine globale Variable. Das ist zwar prima, denn globale Variablen sind böse, Python spricht über den Namen jedoch immer nur die lokale Variable in der Funktion an.

Code: Alles auswählen

>>> a = 100
>>> def test(a):
	print a
	a = a + 5
	print a

	
>>> test(5)
5
10
>>> a
100
Du solltest dir noch einmal "Namespaces" in Python anschauen.
PPatrick
User
Beiträge: 3
Registriert: Donnerstag 25. Oktober 2012, 09:29

Ich bin noch am anfang mit Python, jedoch :-P wenn du sagst, globale Variablen sind böse, dann muss ich wohl fragen: Warum?!?
Vielleicht bin ich in Python noch nicht all zu bewandert, Jedoch mache ich beruflich Softwareentwicklung, Security Audits für Div Staatliche Einrichtung in welcher es darum geht, Fehler zu finden und meiner Meinung nach, darf jeglicher Code im Aufbau aussehen wie er will, denn Blackbox und Whitebox testing Serverseitig hat keinerlei notwendigkeit was Sicherheit angeht. Denn sonnst müsste ich eingestehen, dass Jeder Code, welcher Modular, lesbar und Performant sein soll und das ist ausnahmslos jeder, da encryption und forensic protection gesetzlich nicht gestattet ist eine einzige Sicherheitslücke ist.

Ich möchte keine Diskussionen lostreten, sondern bloß eine Layermodell in seiner Konstruktion legitimieren.

Aber Danke, ich werde mir die "Magic" nochmals ansehen, aber auch eine andere Herangehensweise in einem Transaktionsmodell : Mein Projekt erstreckt sich nur privater Natur, und das fehlerpotential erstreckt sich nicht bei Python sondern bei einer nicht korrekten Implementierung von Modbus -> halt made in Taiwan
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du redest von einem Layermodell und Modularitaet, um globale Variablen zu legitimieren. Nun, letztere machen die ersten beiden schwer bis unmoeglich, da sie

- alle Layer durchbrechen, v.a. wenn sie ueberschrieben werden
- Code nicht modular verstehbar machen, d.h. man muss das Modul (gluecklicherweise gibt es nur modulweite Globals) in seiner Gaenze erfassen, um den Code einer Funktion mit einem Global zu verstehen

Natuerlich darf Code aussehen wie er will, da dass aber immer einen Einfluss auf Lesbarkeit und Verstehbarkeit - und damit auch auf deine Sicherheitsluecken - hat, _sollte_ er es nicht.
PPatrick
User
Beiträge: 3
Registriert: Donnerstag 25. Oktober 2012, 09:29

Bitte was? Aber wie auch immer, aber dann halte vorallem von Oracle 8i - 11g Abstand die Integration von DB-Links u. Schnittstellen PL/Sql Transaktionsmodell würde dich in deinen Grundfesten erschüttern.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Diese Aussagen
PPatrick hat geschrieben: Vielleicht bin ich in Python noch nicht all zu bewandert, Jedoch mache ich beruflich Softwareentwicklung, Security Audits für Div Staatliche Einrichtung in welcher es darum geht, Fehler zu finden ...
passen irgend wie nicht zu folgendem:
PPatrick hat geschrieben:Ich bin noch am anfang mit Python, jedoch :-P wenn du sagst, globale Variablen sind böse, dann muss ich wohl fragen: Warum?!?
:shock:

Deine Argumentation im mittleren Absatz, insbesondere die angebliche kausale Schlussfolgerung, erschließt sich mir nicht. Vielleicht hast Du das einfach zu schnell und schlampig aufgeschrieben? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

PPatrick hat geschrieben:Aber wie auch immer, aber dann halte vorallem von Oracle 8i - 11g Abstand die Integration von DB-Links u. Schnittstellen PL/Sql Transaktionsmodell würde dich in deinen Grundfesten erschüttern.
Deine Aussage macht in der Form keinen Sinn. Was hat das mit globalen Variablen zu tun? Wie ist Oracle da überhaupt relevant?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Zur "global-oder-nicht-global"-Diskussion hab' ich nichts beizutragen, aber zu Deinem Beispiel hab' ich eine Frage:
Soll der Wert um 1 erhöht werden, wenn er eingangs zwischen 1 und 9998 liegt und auf 1 zurückgesetzt, wenn er < 0 und > 9998 ist?
Wenn dem so ist, könnte folgendes eine Lösung sein:

Code: Alles auswählen

def set_id(id):
    if 0 < id < 9999:
        return id + 1
    return 1
Und um die Werte von Modulebene zur Funktion und wieder zurück zu transportieren, lässt sich das ganz einfach verwenden:

Code: Alles auswählen

CTransIDCurrent = set_id(CTransIDCurrent)
Oder hab' ich überhaupt nicht begriffen, um was es hier geht?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

PPatrick hat geschrieben:Nachdem ich nun Jahrelang Perl......
Ist es möglich, dass du zu lange mit Perl programmiert hast?

Gruß wu :wink:
Take it easy Mates!
BlackJack

@wuf: Halte ich für wahrscheinlich, und die Programmiersprache scheint auch Einfluss auf das restliche Denken und die Wahrnehmung von deutscher Grammatik zu haben. :twisted:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Haha - schöner freitäglicher Trollbeitrag. :lol:

Geballter Unsinn wird auch mit ein paar Fremdwörtern gespickt, nicht wahrer ;)

Upps, ist ja von Donnerstag...
Antworten