У меня было такое же требование: когда пользователь нажимает на значок расширения, должно открыться небольшое всплывающее окно. В моем случае я писал расширение, которое будет давать обновления по выборочным акциям всякий раз, когда нажимается значок. Вот как выглядело мое всплывающее окно.
Если у вас было одно и то же требование, прочитайте ниже.
как мой файл manifest.json
выглядел.
Весь тяжелый подъем был обработан только файлом manifest.json
. Существует раздел browser_action
, внутри которого есть ключ с именем default_popup
, просто поместите имя файла HTML, которое вы хотите отобразить всплывающее окно.
Я хотел, чтобы мое расширение работало на всех поэтому я добавил атрибут matches
в content_scripts
. Мне действительно не нужно было помещать файл jquery jquery-3.2.1.js
в массив js
, но диспетчер расширений не позволял мне оставить этот массив пустым.
Надеюсь, что это поможет, сделайте комментарий, если у вас есть любые сомнения относительно ответа.
Другой (немного более компактный) способ:
name, first, second = a.split('_')
first_range = range(int(first[1]), int(first[3]) + 1)
second_range = range(int(second[1]), int(second[3]) + 1)
res = ['{}_{}_{}'.format(name, i, j) for j in second_range for i in first_range]
# ['NAME_1_3', 'NAME_2_3', 'NAME_1_4', 'NAME_2_4', 'NAME_1_5', 'NAME_2_5']
То, что вы ищете, это декартово произведение . По сути, это дает все возможные комбинации двух входов списка. К счастью, библиотека Python itertools
имеет встроенный класс product
, который может выступать в качестве итератора. Итак, теперь мы хотим сделать это в 3 шага:
Поскольку я предполагаю, что вы можете иметь любое количество {x:y}
с, мы будем использовать цикл while
def parse_string(string):
index_of_ = string.find ("_")
name = string [:index_of_]
if index_of_ == -1: return name, []
ranges = []
while index_of_ != -1: # still an _
next_underscore = string.find ("_", index_of_ + 1)
if next_underscore == -1: # last underscore
range_ = string [index_of_ + 1:]
else: range_ = string [index_of_ + 1:next_underscore]
start = range_ [1 : range_.find (":")]
end = range_ [range_.find (":") + 1 : -1]
ranges.append (tuple (range (int (start), int (end) + 1))) # put all those numbers in
if next_underscore == -1: break
else: index_of_ = next_underscore
return name, ranges
Эта функция зацикливает строку, извлекает имя и итеративно находит диапазоны. Он возвращает имя и список всех диапазонов, поэтому для вашего примера - NAME, [(1, 2), (3, 4, 5)]
from itertools import product def generate_combos(ranges): return product (*ranges) # unpack the list
Это просто помогает нам передать список в product
, который выполняет всю тяжелую работу.
Здесь нам нужна функция для объединения двух других. Сначала он анализирует строку, чтобы получить диапазоны и имя. Затем для каждой комбинации декартового произведения он итеративно добавляет цифру к имени, а затем сохраняет результат:
def generate_string(string):
name, ranges = parse_string (string)
results = []
for combo in generate_combos (ranges):
result = name
for num in combo:
result += f"_{num}"
results.append (result)
return results
Пример:
print (generate_string ("NAME_{1:2}_{3:5}"))
Дает:
['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']
Самый элегантный и динамичный способ решения этой проблемы - использование рекурсии:
import re
a = "NAME_{1:2}_{3:5}"
b = "NAME_{1:2}"
c = "NAME"
d = "NAME_{1:2}_{3:4}_{7:8}"
def recure(myRanges, myString, varReference):
if not myRanges:
varReference.append(myString)
return
for i in myRanges[0]:
tempVar = myRanges[:]
del tempVar[0]
recure(tempVar, myString + "_" + str(i), varReference)
def getMyList(myInput):
myInputList = list(myInput)
a = [i.start() for i in re.finditer('{', myInput)]
try:
myName = myInput[:a[0] - 1]
except:
myName = myInput
myRanges = [range(int(myInputList[i + 1]), int(myInputList[i + 3]) + 1) for i in a]
myList = []
recure(myRanges, myName, myList)
return myList
print(getMyList(a)) # -> ['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']
print(getMyList(b)) # -> ['NAME_1', 'NAME_2']
print(getMyList(c)) # -> ['NAME']
print(getMyList(d)) # -> ['NAME_1_3_7', 'NAME_1_3_8', 'NAME_1_4_7', 'NAME_1_4_8', 'NAME_2_3_7', 'NAME_2_3_8', 'NAME_2_4_7', 'NAME_2_4_8']
Оригинальный пост
.
a = "NAME_{1:2}_{3:5}"
aList = list(a)
myString = a[:a.find("_")]
startI = int(aList[a.find("{") + 1])
endI = int(aList[a.find("}") - 1]) + 1
startII = int(aList[a.rfind("{") + 1])
endII = int(aList[a.rfind("}") - 1]) + 1
myList = []
for i in range(startI, endI):
for j in range(startII, endII):
myList.append(myString + "_" + str(i) + "_" + str(j))
print(myList) # -> ['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']