Как редактировать переменную глобально python - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над python библиотекой. У меня есть функция, moveTrack(fileorvar, track_code, x, y). Сейчас у меня работают аргументы track_code, x и y. fileorvar решает, редактируете ли вы переменную или файл, и в этом случае функция должна будет открыть указанный файл. Я делаю это следующим образом:

def moveTrack(self, fov, track_code, x-coord, y-coord):
    print((lambda c,n,x,y,l:'#'.join([','.join([(lambda o:' '.join([(lambda m:(lambda p,v:'0'if p==0else(('-'if v else'')+''.join([n[((p//(32**q))%32)]for q in range(int(l.log(p,32))+1)][::-1])))(abs(m),(m<0)))(int(m,32)+x if(t!=2and j%2==0)or(t==2and j%2==1)else int(m,32)+y)if(t!=2or j!=0)else m for j,m in enumerate(o)if m!='']))(i.split(' '))for i in d])for t,d in enumerate(c)]))([a.split(',')for a in track_code.split('#')],list('0123456789abcdefghijklmnopqrstuv'),int(x-coord),int(y-coord),__import__('math')))

Аргумент self необходим, но не используется пользователем вообще. Я хочу, чтобы внутри него была инструкция if / else:

def moveTrack(self, fov, track, x-coord, y-coord):

    if fov == 'f':
        track_code = open(track_code, 'r')
    else:
        track_code = str(track)

    print((lambda c,n,x,y,l:'#'.join([','.join([(lambda o:' '.join([(lambda m:(lambda p,v:'0'if p==0else(('-'if v else'')+''.join([n[((p//(32**q))%32)]for q in range(int(l.log(p,32))+1)][::-1])))(abs(m),(m<0)))(int(m,32)+x if(t!=2and j%2==0)or(t==2and j%2==1)else int(m,32)+y)if(t!=2or j!=0)else m for j,m in enumerate(o)if m!='']))(i.split(' '))for i in d])for t,d in enumerate(c)]))([a.split(',')for a in track_code.split('#')],list('0123456789abcdefghijklmnopqrstuv'),int(x-coord),int(y-coord),__import__('math')))

Это не будет работать. это потому, что когда я редактирую track_code, он сохраняется только внутри этой функции. Я знаю, что могу это исправить, поместив однострочник внутри каждого оператора if / else. Однако я хотел бы избежать этого, чтобы улучшить читабельность.

РЕДАКТИРОВАТЬ

Теперь у меня есть следующее:

def moveTrack(self, fov, track, x-coord, y-coord):

        track_code = None

        if fov == 'f':
            global track_code
        track_code = open(track, 'r')
            else:
        global track_code
            track_code = track


        print((lambda c,n,x,y,l:'#'.join([','.join([(lambda o:' '.join([(lambda m:(lambda p,v:'0'if p==0else(('-'if v else'')+''.join([n[((p//(32**q))%32)]for q in range(int(l.log(p,32))+1)][::-1])))(abs(m),(m<0)))(int(m,32)+x if(t!=2and j%2==0)or(t==2and j%2==1)else int(m,32)+y)if(t!=2or j!=0)else m for j,m in enumerate(o)if m!='']))(i.split(' '))for i in d])for t,d in enumerate(c)]))([a.split(',')for a in track_code.split('#')],list('0123456789abcdefghijklmnopqrstuv'),int(x-coord),int(y-coord),__import__('math')))

Но когда я пытаюсь импортировать библиотеку выдает эту ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python38\lib\site-packages\frhd\__init__.py", line 1, in <module>
    from frhd import Track, Encode, Decode, Loader
  File "C:\Python38\lib\site-packages\frhd\Track.py", line 14
    global track_code
    ^
SyntaxError: name 'track_code' is assigned to before global declaration

WHYYYYYY?

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете изменить глобальную переменную, объявив ее с помощью клавиш «global» внутри функции.

track_code = None

def moveTrack(self, fov, track, x-coord, y-coord):

   global track_code
   # Now changing track_code will update global variable
   track_code = 'something'

...