Python Forum
Identifying string success flag - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Identifying string success flag (/thread-20487.html)



Identifying string success flag - graham23s - Aug-13-2019

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


RE: Identifying string success flag - ichabod801 - Aug-13-2019

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'])



RE: Identifying string success flag - metulburr - Aug-13-2019

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.


RE: Identifying string success flag - nilamo - Aug-14-2019

(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



RE: Identifying string success flag - graham23s - Aug-14-2019

Thank you very much guys! solved the issue using your help. Python 3.8 does look good :)