I'm struggling to get this list from a json file to call correctly, and I was hoping for help. I'm still really new to learning python. I always end up with "TypeError: list indices must be integers or slices, not str"
CONFIG_ITEMS = 'items.json'
with open(CONFIG_ITEMS) as json_data_file:
config_items = json.load(json_data_file)
def get_value(items:str):
items = items.replace(" ", "").lower()
aliases = config_items['aliases']
if items in aliases:
return [value[aliases]]
else:
return None
The json looks like this:
[
{
"aliases": ["carvedtwine","carved","carvedt","ct"],
"value": 10
}
]
What does your config look like?
(Jan-11-2019, 07:09 PM)giveen Wrote: [ -> ] aliases = config_items['aliases']
if items in aliases:
return [value[aliases]]
aliases
is a list. Using a list as an index doesn't make sense, so what is your intention with this code snippet?
>>> aliases = ["spam", "eggs"]
>>> value = list(range(5))
>>> value[aliases]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not list
The code feeds back into a discord command. I know this works, as my previous version of the bot works fine, but the json file was a mess and needed to be completely rewritten.
async def calc(ctx, quantity: float, itemA: str, itemB: str):
itemAPrice = get_value(itemA)
itemBPrice = get_value(itemB)
if itemAPrice and itemBPrice:
itemQuotient = itemAPrice/itemBPrice
itemBEquivalent = round(quantity * itemQuotient, 2)
quantity = quantity
itemA = itemA
itemBEquivalent = itemBEquivalent
itemB = itemB
author = ctx.message.author.name
embed=discord.Embed(title="\N{CONVENIENCE STORE} Recommended Exchange Rate \N{CONVENIENCE STORE}", description=f'{quantity} {itemA} is equal to {itemBEquivalent} {itemB}', color=0xDA70D6)
embed.set_footer(text=f"Requested by {author}")
await ctx.send(embed=embed)
await ctx.message.delete()
elif not itemAPrice:
await ctx.send('No match found for ' + itemA)
elif not itemBPrice:
await ctx.send('No match found for ' + itemB)
Previous version of it looked like this.
CONFIG = 'config.json'
with open(CONFIG) as json_data_file:
config = json.load(json_data_file)
TOKEN = config['token']
items = config['items']
BOT_PREFIX = config['prefix']
aliases = config['aliases']
def get_value(item: str):
if item:
item = item.replace(" ", "").lower()
try:
return items[aliases[item]]
except KeyError:
return
else:
return None
with the json looking like this
https://pastebin.com/eNztKujJ
(Jan-11-2019, 07:44 PM)giveen Wrote: [ -> ]return items[aliases[item]]
That's different from what you're doing, though. In this version, you're getting one particular item out of the aliases (this time, aliases is probably a dict though), and using the value from aliases as a key/index to
items
, instead of using the whole aliases list as the index.
Maybe your new code should be something like this?
aliases = config_items['aliases']
if items in aliases:
return [value[aliases[item]]]
That was what I had played with as well, similar idea. Still studying deeper into JSON syntax to see where I could be going wrong.
TypeError: list indices must be integers or slices, not str
I think slicing needs to be done, so I'm reading up on it.