Итак, есть элементы фирменного стиля, такие как цвета, шрифты и т. д., которые редко меняются, но когда они меняются, все должны реализовывать их одинаково. Например, я хочу написать отдельную подпрограмму, которую все будут вызывать для импорта цветов, чтобы все отчеты имели одинаковый вид. Вопрос в том, как лучше всего передать эти переменные?
Вариант 1: обычная передача переменных
def main():
company_BLUE = "#015b95"
company_GREEN = "#3D8B37"
company_GREY = "#656565"
company_RED = "#8F2D22"
return company_BLUE, company_GREEN, company_GREY, company_RED
Импортируйте, а затем вызовите его, используя:
import getColors
[Blue, Green, Grey, Red] = getColors.main()
Это становится утомительным, если есть много переменных, которые нужны не всем.
Вариант 2: использование глобальных переменных
def main():
global company_BLUE
global company_GREEN
global company_GREY
global company_RED
company_BLUE = "#015b95"
company_GREEN = "#3D8B37"
company_GREY = "#656565"
company_RED = "#8F2D22"
Это раздражает, когда приходится всегда ставить глобальный. Или вы пишете новую переменную, например:
Blue = global company_BLUE
но это просто добавляет ненужные переменные.
Вариант 3: как-то использовать классы, но я не знаю, как это адаптировать здесь.
Каково ваше мнение или есть еще лучшее решение?
Почему бы просто не сделать его модулем, определяющим глобальные константы? Почему это должна быть функция? Кроме того, называть переменные «зелеными» и т. д. — плохая семантика. Что, если вы сделаете редизайн и все, что было зеленым, теперь станет желтым? Вам следует назвать переменные примерно так: «основной» и «акцент», что описывает их использование, а не внешний вид.
Итак, вы планируете хранить фирменный стиль в файле main.py
? И вы ищете лучший способ использования глобальных переменных? Что это за корпоратив?!? Поместите их в какую-нибудь общекорпоративную вики. Или файл JSON, если вам действительно нужно.
Все ваши реализации/подходы на самом деле жизнеспособны, но вы можете спросить или узнать, как можно вызвать функцию Python таким образом, чтобы она не меняла значение каждой переменной.
Ниже приведен пример, который можно легко адаптировать для вашего случая:
def my_function():
return 1, 2, 3, 4, 5
#Suppose you only need the first two outputs
a, b, *_ = my_function()
print(a) # 1
print(b) # 2
прямо сейчас я использую много элифов и добавляю результат, который затем выводится, но, как я уже сказал, это будет долго, утомительно и в конечном итоге медленно, хотя, вероятно, все еще незначительно
Что делать, если мне нужно только четвертое значение?
это плохая идея. Используйте список, если хотите сделать это таким образом. Представьте, что вам нужно вернуть 1000 значений. Это было бы очень длинное заявление о возврате.
@Jeyekomon *_ называется оператором «все кроме», который доступен только в Python 3. Итак, чтобы получить доступ только к четвертому значению, вы можете написать *_,fourth_value = my_function(). Тема раскрыта linkedin.com/pulse/unpacking-underscore-python-kaushik-t-d-roy и stackoverflow.com/questions/13726155/…
@ Elerium115 Elerium115, вы пытаетесь бесполезно усложнить ситуацию, ОП, похоже, владеет Python и хорошо знает, как взвешивать различные варианты.
@NaveedAhmed Ваш код *_,fourth_value = my_function()
возвращает пятое значение 5
. Я хочу четвертое значение 4
. Как это сделать?
Я не пробовал, но думаю, это должно быть *, четвёртое_значение, * = my_function()
Я не пробовал, но думаю, это должно быть обновление *, four_value, * = my_function(), теперь я протестировал его и понял проблему, которую вы хотите выделить. Возможно, эта конструкция не будет работать без какой-либо магической оговорки.
Вы можете использовать простой класс данных:
from dataclasses import dataclass
@dataclass
class Color:
BLUE = "#015b95"
GREEN = "#3D8B37"
GREY = "#656565"
RED = "#8F2D22"
company_color = Color()
print(company_color.RED)
дает:
#8F2D22
Мне нравится этот вид. Кажется, это очень интуитивно понятно для использования в дальнейшем. Большое спасибо.
Я предлагаю создать config.ini
для хранения цветов, а затем использовать configparser (который является частью стандартной библиотеки). Простой пример: пусть config.ini
контент будет
[company]
Blue = #015b95
Green = #3D8B37
Grey = #656565
Red = #8F2D22
затем получите к нему доступ следующим образом
import configparser
config = configparser.ConfigParser()
config.read("config.ini")
print(config["company"]["Blue"]) # prints #015b95
Таким образом, вы можете позволить кому-то без знания языка Python, и config.ini
ограничено хранением только настраиваемых значений, нет способа заставить его выполнять произвольный код Python, что может произойти, если вы скажете «создать config.py
», а затем скажете «сделать» from config import blue
.
Это кажется более сложным и на самом деле немного менее интуитивным, чем вариант класса выше. Хотя я подумаю об этом еще немного, но пока я склоняюсь к тому, чтобы вариант класса был самым плавным.
Blue = global company_BLUE
— неверный синтаксис, и у меня возникает подозрение, что вы думаете, чтоglobal
гораздо более глобально, чем есть на самом деле —global
просто на уровне модуля, так же, как если бы вы присвоили переменную вне какого-либо класса или функции.