Warning: preg_grep(): Compilation failed: quantifier does not follow a repeatable item at offset 134 in /var/www/tg-me/post.php on line 75
Библиотека питониста | Python, Django, Flask | Telegram Webview: pyproglib/6606 -
Telegram Group & Telegram Channel
😇 Ошибка дня: UnboundLocalError

Сегодня разбираем одну из тех ошибок в Python, которая выглядит загадочно, но легко объяснима, если знать одну тонкость.

💥 Что произошло

1️⃣ Вы определили функцию-декоратор, всё работает:
def trigger(*fns):
def decorator(fn):
fn._next = fns

def _wrapper():
fn()
for f in fn._next:
f()
return _wrapper
return decorator


2️⃣ Затем использовали:
def step_2():
print("step 2")

def step_3():
print("step 3")

@trigger(step_2, step_3)
def step_1():
print("step 1")

step_1()

Вывод:
step 1
step 2
step 3


3️⃣ Но потом — решили переименовать переменную в цикле, чтобы она называлась так же, как и fn снаружи:
def _wrapper():
fn()
for fn in fn._next: # ❗️ shadowing
fn()


4️⃣ Результат:
UnboundLocalError: cannot access local variable 'fn' where it is not associated with a value


Почему так

В Python, если переменная где-то присваивается в функции — она считается локальной на весь скоуп этой функции. Даже если вы пытаетесь её использовать до присваивания.

➡️ В примере выше: переменная fn переопределяется в цикле, а значит, Python считает, что она локальная для всей _wrapper(). Поэтому вызов fn() выше в коде — обращение к переменной, которой ещё нет, отсюда и UnboundLocalError.

На заметку:
➡️ Вложенные функции и декораторы — зона риска для shadowing
➡️ Если вы хотите использовать переменную из внешнего скоупа — не переопределяйте её имя внутри тела функции
➡️ Такие тонкости особенно актуальны при рефакторинге

Как исправить

Просто не переименовывайте переменную в fn повторно. Назовите её f, next_fn, step, callback — что угодно:
for step in fn._next:
step()


💬 Вопрос к вам: какие ошибки Python вам кажутся самыми «обидными», но по факту — обучающими?

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍7❤‍🔥1🤩1



tg-me.com/pyproglib/6606
Create:
Last Update:

😇 Ошибка дня: UnboundLocalError

Сегодня разбираем одну из тех ошибок в Python, которая выглядит загадочно, но легко объяснима, если знать одну тонкость.

💥 Что произошло

1️⃣ Вы определили функцию-декоратор, всё работает:

def trigger(*fns):
def decorator(fn):
fn._next = fns

def _wrapper():
fn()
for f in fn._next:
f()
return _wrapper
return decorator


2️⃣ Затем использовали:
def step_2():
print("step 2")

def step_3():
print("step 3")

@trigger(step_2, step_3)
def step_1():
print("step 1")

step_1()

Вывод:
step 1
step 2
step 3


3️⃣ Но потом — решили переименовать переменную в цикле, чтобы она называлась так же, как и fn снаружи:
def _wrapper():
fn()
for fn in fn._next: # ❗️ shadowing
fn()


4️⃣ Результат:
UnboundLocalError: cannot access local variable 'fn' where it is not associated with a value


Почему так

В Python, если переменная где-то присваивается в функции — она считается локальной на весь скоуп этой функции. Даже если вы пытаетесь её использовать до присваивания.

➡️ В примере выше: переменная fn переопределяется в цикле, а значит, Python считает, что она локальная для всей _wrapper(). Поэтому вызов fn() выше в коде — обращение к переменной, которой ещё нет, отсюда и UnboundLocalError.

На заметку:
➡️ Вложенные функции и декораторы — зона риска для shadowing
➡️ Если вы хотите использовать переменную из внешнего скоупа — не переопределяйте её имя внутри тела функции
➡️ Такие тонкости особенно актуальны при рефакторинге

Как исправить

Просто не переименовывайте переменную в fn повторно. Назовите её f, next_fn, step, callback — что угодно:
for step in fn._next:
step()


💬 Вопрос к вам: какие ошибки Python вам кажутся самыми «обидными», но по факту — обучающими?

Библиотека питониста #буст

BY Библиотека питониста | Python, Django, Flask


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/pyproglib/6606

View MORE
Open in Telegram


Библиотека питониста | Python Django Flask Telegram | DID YOU KNOW?

Date: |

Telegram today rolling out an update which brings with it several new features.The update also adds interactive emoji. When you send one of the select animated emoji in chat, you can now tap on it to initiate a full screen animation. The update also adds interactive emoji. When you send one of the select animated emoji in chat, you can now tap on it to initiate a full screen animation. This is then visible to you or anyone else who's also present in chat at the moment. The animations are also accompanied by vibrations. This is then visible to you or anyone else who's also present in chat at the moment. The animations are also accompanied by vibrations.

Export WhatsApp stickers to Telegram on Android

From the Files app, scroll down to Internal storage, and tap on WhatsApp. Once you’re there, go to Media and then WhatsApp Stickers. Don’t be surprised if you find a large number of files in that folder—it holds your personal collection of stickers and every one you’ve ever received. Even the bad ones.Tap the three dots in the top right corner of your screen to Select all. If you want to trim the fat and grab only the best of the best, this is the perfect time to do so: choose the ones you want to export by long-pressing one file to activate selection mode, and then tapping on the rest. Once you’re done, hit the Share button (that “less than”-like symbol at the top of your screen). If you have a big collection—more than 500 stickers, for example—it’s possible that nothing will happen when you tap the Share button. Be patient—your phone’s just struggling with a heavy load.On the menu that pops from the bottom of the screen, choose Telegram, and then select the chat named Saved messages. This is a chat only you can see, and it will serve as your sticker bank. Unlike WhatsApp, Telegram doesn’t store your favorite stickers in a quick-access reservoir right beside the typing field, but you’ll be able to snatch them out of your Saved messages chat and forward them to any of your Telegram contacts. This also means you won’t have a quick way to save incoming stickers like you did on WhatsApp, so you’ll have to forward them from one chat to the other.

Библиотека питониста | Python Django Flask from us


Telegram Библиотека питониста | Python, Django, Flask
FROM USA