Python Forum

Full Version: Identifying string success flag
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi Guys,

I have a string of text seperated by a pipe symbol like:

# a list of flags to look for on success ...
submit_success = "TEXT_1|TEXT_2|TEXT_3|etc"

# if a flag is found do our routines ...
if any(s in self.driver.page_source for s in submit_success.split('|')):
    # run this code once a submit_success flag is found
Once one of those TEXT strings is found in the html we mark it as a success.

What i'm having trouble with is, how can i find out which of the "submit_success" flags was found?

Any help would be appreciated.

cheers
If you can be sure that submit_success only contains relevant flags, and nothing you're not interested in, you can just use the split string. Otherwise, you could use a set:

valid_flags = set('a|e|i|o|u'.split('|'))
current_flags = 'c|r|a|i|g'
matched_flags = valid_flags.intersection(current_flags.split('|')) # will be set(['a', 'i'])
built in any function only returns a boolean. As is i dont believe there is a way within the builtin to return the matches. Thus you would have to build your own any function that returns the matches.
(Aug-13-2019, 05:07 PM)graham23s Wrote: [ -> ]What i'm having trouble with is, how can i find out which of the "submit_success" flags was found?
If you want to keep track of an intermediate value, using any() might not be the best, since the assumption is that it's a side-effect free operation. It doesn't have to be side-effect free, you just need to put a little effort into getting it to work.

>>> class ValueFinder:
...   def __init__(self, callback):
...     self.callback = callback
...     self.match = None
...     self.match_found = False
...   def __call__(self, test):
...     if self.callback(test):
...       self.match = test
...       self.match_found = True
...     return self.match_found
...
>>> submit_success = "TEXT_1|TEXT_2|TEXT_3|etc".split("|")
>>> page_source = '''one fish, TEXT_2 fish, red fish, blue fish'''
>>> finder = ValueFinder(lambda x: x in page_source)
>>> if any(finder(s) for s in submit_success):
...   print(finder.match)
...
TEXT_2
Or, instead of using any(), you could roll your own:
>>> submit_success = "TEXT_1|TEXT_2|TEXT_3|etc".split("|")
>>> page_source = '''one fish, TEXT_2 fish, red fish, blue fish'''
>>> def first(test, seq):
...   for item in seq:
...     if test(item):
...       return item
...   return None
...
>>> match = first(lambda s: s in page_source, submit_success)
>>> if match:
...   print(match)
...
TEXT_2
Once python 3.8 is out, you could also use the walrus operator to do this:
submit_success = "TEXT_1|TEXT_2|TEXT_3|etc"

if any((match := s) in self.driver.page_source for s in submit_success.split('|')):
    # "match" is the TEXT_ value that matched
Thank you very much guys! solved the issue using your help. Python 3.8 does look good :)