Инициализация переменных в Пайтоне используя функцию, отделенную от main ()

Чтобы инициализировать какие-то переменные в программе, написанной в Пайтоне (структурированной формы, не используя программирования, ориентируемого на объекты), я хочу использовать функцию, обозначенную инициализацию (), в которую он призывается с функции main (). Проблема - область этих переменных, так как, если я даю им Вашу начальную стоимость в функции инициализация (), они после того, как стараюсь использовать в функции main () будет производиться ошибка, потому что там они не существуют. Например:

import serial

def inicializacion():
    puerto = '/dev/ttyACM0'
    baudRate = 115200
    buffer = ''
    ser = serial.Serial(puerto, baudRate, timeout=1)


def main():
    inicializacion()
    buffer = buffer + leerDatos(ser)

Какие альтернативы есть, чтобы предотвращать использование "глобального" в функции инициализации? Возможно осуществлять какое-то решение, не будучи должен перемещать переменные как аргументы и не будучи должен возвращать их в "return"?

15
задан 01.12.2015, 10:05
4 ответа

Итак, я не думаю, что это возможное, не прибегая к не рекомендуемому altamante global. Специфический случай, который применяет образцы верно в Программировании, Ориентируемом на Объекты, было бы хорошим, что ты объясняешь разум, из-за которого ты стараешься предотвращать ее:

import serial


class Clase():
    def __init__(self, puerto, baud_rate, buffer) # inicializacion()
        self.puerto = puerto
        self.baud_rate = baud_rate
        self.buffer = buffer
        self.serial = serial.Serial(puerto, baudRate, timeout=1)

    def leer_datos(self):
        # Tu código

Если ты пробуешь использовать параметры конфигурации, ты мог бы создавать специфический файл, который коснется требования:

settings.py

puerto = '/dev/ttyACM0'
baudRate = 115200
buffer = ''

main.py

import serial
import settings


def main():
    ser = serial.Serial(settings.puerto, settings.baudRate, timeout=1)
    buffer = settings.buffer + leerDatos(ser)

Другой выбор - упомянутый из-за @Carlangueitor, в которой ты двигаешь твою конфигурацию в файл .env внутри твоего проекта и так ты избегаешь выставлять конфигурацию в одном из файлов. Ты можешь использовать dotenv.

12
ответ дан 08.11.2019, 21:06

Я верю в то, что podrГ-схвати, использовать словарь. Ты можешь перемещать словарь, asГ - как возвращение этого, поддерживая изменения, которые ты реализуешь в Вашем внутреннем помещении. FГ-jate в следующем cГіdigo.

def inicializacion():
    toret = {}
    toret["puerto"] = '/dev/ttyACM0'
    toret["baudRate"] = 115200
    toret["buffer"] = ''

    return toret


def main():
    datos = inicializacion()
    datos["buffer"] = "hola"
    print(datos["buffer"])
    print(datos)

main()

Ты Имеешь cГіdigo aquГ-: http://ideone.com/BjQyuX Надеялся, что он следует тебе Гєtil.

10
ответ дан 08.11.2019, 21:06

Самая простая форма и pythonica, приспосабливая твой собственный код:

import serial

def inicializacion(puerto='/dev/ttyACM0', baudRate=115200):
    ser = serial.Serial(puerto, baudRate, timeout=1)
    return ser


def main():
    ser = inicializacion()
    buffer=''
    buffer = buffer + leerDatos(ser)

    # El puerto se ha de cerrar para evitar fugas de memoria..
    ser.close()

Идеальное состояло бы в том, чтобы менять ему имя inicializacion в более экспрессивный и ясный другой как p.ej.: inicializacion_puerto_serie

Переместив стоимость в функцию inicializacion как назначенные по умолчанию параметры возможно повторно использовать код с другим портом или другим baud_rate различный.

Не забывай никогда, когда ты откроешь файл или последовательный порт (который для системы является тем же самым) закрытия этого правильно, чтобы предотвращать бегство памяти.

4
ответ дан 08.11.2019, 21:06

Я предлагаю тебе следующее:

import serial

puerto='/dev/ttyACM0'
baudRate=115200

def main():
    buffer=''
    serial.Serial(puerto, baudRate, timeout=1)
    buffer=buffer+leerDatos(str)
3
ответ дан 08.11.2019, 21:06
  • 1
    Это традиционная форма, я не думаю, что он что intenta делать – César 01.12.2015, 10:31
  • 2
    Я могу, что, не но он не отвечает на комментарии, очень широк вопрос – Santi92 01.12.2015, 10:33